gabebu
Goto Top

Powershell: Netzlaufwerk für spezifische Gruppe erstellen

Hallo Zusammen

Ich arbeite in meiner Testgruppe gerade an einem Login-Script. Das Ziel soll sein, ein Netzlaufwerk hinzuzuüfgen, wenn der Benutzer einer bestimmten Gruppe angehört. Soweit bin ich bisher:
#Keine Fehler
$ErrorActionPreference = 'SilentlyContinue'  
#Benutzername ermitteln
$username = $env:Username
#Gruppen ermitteln
$group = Get-ADPrincipalGroupMembership -Identity $username | select Name | Sort Name


#Überprüfen, ob Ordner existiert
$testpath =  Test-Path \\Gabesrv02\home\$username
if($testpath -eq $True)
{
 
} 
else
{
 #Ordner erstellen
md \\GABESRV02\home\$username
#Berechtigungen erteilen
$Acl = Get-Acl "\\GABESRV02\home\$username"  
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("$username", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")  
$Acl.SetAccessRule($Ar)
Set-Acl "\\GABESRV02\home\$username" $Acl  
$Acl = Get-Acl "\\GABESRV02\home\$username"  
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrator", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")  
$Acl.SetAccessRule($Ar)
Set-Acl "\\GABESRV02\home\$username" $Acl  

}
#Gemeinsames Netzlaufwerk erstellen

if ( $groupsort = "Administrator")  
{
net use x: \\GABESRV02\gabenetshare\Admin /persistent:yes
}
elseif ($group = "Marketing")  
{
    net use x: \\GABESRV02\gabenetshare\Marketing /persistent:yes 
}
elseif ($group = "Mitarbeiter")  
{
    net use x: \\GABESRV02\gabenetshare\Mitarbeiter /persistent:yes

}
else
{
exit
}

Nun habe ich aber folgendes Problem: Wenn ich die Gruppenabfrage mache, übernimmt nur den ersten Gruppenname (In diesem Fall Administrator, da ich als Administrator eingeloggt bin). Die einzige Lösung bisher die ich gefunden habe, wäre die Gruppennamen in einem CSV abzuspeichern und von dort die Namen wieder einzulesen. Gäbe es noch eine andere Möglichkeit?

Besten Dank für Eure Hilfe.

Gruss

gabeBU

Content-Key: 378881

Url: https://administrator.de/contentid/378881

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: emeriks
emeriks 02.07.2018 aktualisiert um 14:18:57 Uhr
Goto Top
Hi,
da hast Du einen Designfehler.

Erstmal verwendest Du zwischendurch "$groupsort" und dann wieder "$group".
Zweitens wertet "If ... ElseIf ..." natürlich nur eine der zutreffenden Bedingungen aus. Also statt "ElseIf" das erste "If" mit "}" abschließen und neu mit "If" abfragen.

Dann ist doch $Group ein Array? Also musst Du doch auch jedes Element einzeln abfragen? Also mit "ForEach" eine Schleife durchlaufen.

Soviel auf die Schnelle.

E.

Edit:
Ich sehe gerade: Ein Laufwerk. Dann statt der "If" ein "Switch". (z.B.: https://www.script-example.com/PowerShell-if)
Mitglied: gabeBU
gabeBU 02.07.2018 aktualisiert um 15:03:59 Uhr
Goto Top
Hey Emeriks

Danke für deinen Input. Ich habe es etwas schlecht formuliert...wenn ein Benutzer mehreren Gruppen angehört, soll er auch alle Netzlaufwerke verbinden (z.B. Administrator ist in den Gruppen Administrator und Mitarbeiter, also sollen beide Netzlaufwerke hinzugefügt werden).
Mit der foreach schleife bin ich mir nicht ganz sicher, wie ich es machen soll:
#Keine Fehler
# $ErrorActionPreference = 'SilentlyContinue' 
#Benutzername ermitteln
$username = $env:Username
#Gruppen ermitteln
$group = Get-ADPrincipalGroupMembership -Identity $username | select Name | Sort Name
$groupsort = Get-ADPrincipalGroupMembership -Identity $username


#Überprüfen, ob Ordner existiert
$testpath =  Test-Path \\Gabesrv02\home\$username
if($testpath -eq $True)
{
 
} 
else
{
 #Ordner erstellen
md \\GABESRV02\home\$username
#Berechtigungen erteilen
$Acl = Get-Acl "\\GABESRV02\home\$username"  
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("$username", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")  
$Acl.SetAccessRule($Ar)
Set-Acl "\\GABESRV02\home\$username" $Acl  
$Acl = Get-Acl "\\GABESRV02\home\$username"  
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrator", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")  
$Acl.SetAccessRule($Ar)
Set-Acl "\\GABESRV02\home\$username" $Acl  

}
#Gemeinsames Netzlaufwerk erstellen

foreach($i in $group)
{
   
    
if ( $group = "Administratoren")  
{
net use x: \\GABESRV02\gabenetshare\Admin /persistent:yes
    
}
if ($group = "Marketing")  
{
    net use x: \\GABESRV02\gabenetshare\Marketing /persistent:yes 
   
}
if ($group = "Mitarbeiter")  
{
    net use x: \\GABESRV02\gabenetshare\Mitarbeiter /persistent:yes
    
}
 $i + 1
}
exit
Mitglied: gabeBU
gabeBU 02.07.2018 um 15:08:15 Uhr
Goto Top
Wow...ich muss natürlich dann verschiedene Laufwerks-Buchstaben zuweisen...ja sorry, manchmal sieht man vor lauter Bäumen den Wald nicht face-smile.

Trotzdem danke für die Hilfe!

Gruss

gabeBU
Mitglied: SlainteMhath
SlainteMhath 02.07.2018 um 15:13:14 Uhr
Goto Top
Moin,

Ich arbeite in meiner Testgruppe gerade an einem Login-Script. Das Ziel soll sein, ein Netzlaufwerk hinzuzufügen, wenn der Benutzer einer
bestimmten Gruppe angehört. Soweit bin ich bisher:
Also ich glaube du hast das Konzept nicht so ganz im Griff...

Du musst das Erstellen des Verzeichnisses und das Einstellen der Rechte vom Mappen ("net use...") trennen. Das Anlegen muss vom Admin ausgeführt werden, das mappen vom Benutzer.

Wobei man das mappen heutzutage per GPO und nicht mehr per Script erledigt.

Über den Code-"Styl" sag' ich jetzt lieber nichts .)

lg,
Slainte
Mitglied: erikro
erikro 02.07.2018 um 16:28:44 Uhr
Goto Top
Moin,


Zitat von @gabeBU:

$group = Get-ADPrincipalGroupMembership -Identity $username | select Name | Sort Name
$groupsort = Get-ADPrincipalGroupMembership -Identity $username

Warum zweimal? Ich nehme mal die zweite Zeile.

foreach($i in $group)

Nein. Das muss heißen:

foreach ($group in $groupsort)

{


if ( $group = "Administratoren")
{
net use x: \\GABESRV02\gabenetshare\Admin /persistent:yes

}
if ($group = "Marketing")
{
net use x: \\GABESRV02\gabenetshare\Marketing /persistent:yes

}
if ($group = "Mitarbeiter")
{
net use x: \\GABESRV02\gabenetshare\Mitarbeiter /persistent:yes

}
$i + 1
}

Überflüssig. Das musst Du bei einer while-Schleife machen. Die foreach-Schleife hat keine Zählervariable.

Hier eine kleine Übersicht über Schleifen in der PS: https://www.script-example.com/Powershell-Loops-Array

hth

Erik
Mitglied: SlainteMhath
SlainteMhath 02.07.2018 um 16:38:12 Uhr
Goto Top
Ne, sorry, so wird das nix...

foreach ($group in $groupsort)
if ($group = "Marketing")

Also...

1. das foresch braucht man gar nicht, man kann direkt mit $group.Contains("Marketing") prüfen ob der string im Array ist.
2. Das "=" ist eine Zuweisung. Einen Vergleich macht man in PS mit "-eq"

if($testpath -eq $True)
Anstatt true abzugfragen und dann nur im "else"-Fall was zu machen, frägst du besser gleich false ab...
Mitglied: erikro
erikro 02.07.2018 um 16:49:26 Uhr
Goto Top
Stimmt, das mit dem = statt -eq habe ich beim Kopieren doch glatt übersehen.