mcnewbie
Goto Top

Ordner mit AD Abfrage erstellen und Berechtigungen setzen

Guten Morgen zusammen,

wie man sich denken kann, habe ich ein Problem und komme damit nicht wirklich weiter.
Ich bin in Sachen Powershell wirklich ein absoluter Neuling.


Ich möchte aus unserem AD bestimmte Gruppen Auslesen und gleich dazu die passenden Ordner erstellen und diese mit den richtigen Berechtigungen versehen.
Die Struktur ist nicht allzu tief.

Soll im Prinzip so ausshen:

Ebene 1: Laufwerksgruppe
Ebene 2: Mitarbeitergruppe1, Mitarbeitergruppe2


Bei meinen bisherigen Basteleien ist nicht wirklich was vernünftiges rausgekommen....Ich möchte auch den Weg umgehen erst einen Export in z.B. eine csv zu machen, nur um diese wieder zu importieren.....


Dankeschön schon einmal im voraus.


Gruß

Content-ID: 7845769307

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

Ausgedruckt am: 23.11.2024 um 15:11 Uhr

Kraemer
Kraemer 14.07.2023 um 08:31:26 Uhr
Goto Top
Morgen,

da hier keiner deine AD-Struktur kennt und du uns nicht sagst, wo eigentlich dein Problem ist, ist eine zielführende Hilfestellung nicht möglich.

Gruß
mcNewbie
mcNewbie 14.07.2023 um 08:36:30 Uhr
Goto Top
Im Grunde mache ich die Abfrage direkt auf dem AD Server und verbinde mir das entsprechende Netzlaufwerk auf dem die Order iwan liegen sollen.

Mein Problem ist ganz einfach, ich weiß nicht wie ich es machen soll face-smile
6376382705
6376382705 14.07.2023 aktualisiert um 08:51:15 Uhr
Goto Top
Hi.

Mein Problem ist ganz einfach, ich weiß nicht wie ich es machen soll face-smile
Immerhin hast Du das Problem erkannt.
Lösung deines Problems: sich mit PowerShell auseinander setzen, üben und lernen. Hilft Dir als Admin ungemein in der Zukunft. (Frag doch mal ChatGPT?)

Es bringt nichts, wenn Dir hier wer den Code vorlegt, den Du stumpf ausführst und noch nicht mal genau kapierst, was da passiert.

Nicht entmutigen lassen -> weitermachen.

Gruß
SlainteMhath
SlainteMhath 14.07.2023 um 08:53:56 Uhr
Goto Top
Moin,

im simpelsten Fall
Verzeichnisse erstellen
get-adgroup -filter "name -like 'a*'" |  %{  
  $dir=New-Item -ItemType Directory -Path ("C:\Path\{0}" -f $_.name)  
}

und dann noch ACLs setzten wie hier beschrieben: https://stackoverflow.com/questions/25779423/powershell-to-set-folder-pe ...

Ohne Gewähr, testen auf eigene Gefahr face-smile

lg,
Slainte
em-pie
em-pie 14.07.2023 um 09:00:53 Uhr
Goto Top
Moin,

Was du brauchst:
  • Get-AdGroup -Filter
  • New-Item -ItemType Folder
  • Set-Acl

Damit kannst du mal recherchieren gehen. Wenn du ein Script erstellt hast und erste Resultate (auch Fehlermeldungen wären Resultate) hast, poste sie hier. Dann werden wir dir besser/ effizienter helfen können face-smile
mcNewbie
mcNewbie 14.07.2023 um 09:01:52 Uhr
Goto Top
Da geb ich dir zu 1000% recht!
Bin auch gerade dabei mich damit zu beschäftigen...aber so wie in vielen Fällen ist es zeitlich gerade nicht einfach......

Das Stundenkonto platz und der Chef frägt warum das so ist face-smile
6376382705
6376382705 14.07.2023 um 09:07:28 Uhr
Goto Top
Da geb ich dir zu 1000% recht!
Wem? Scheinbar hast Du auch keine Zeit für das Forum. face-smile

aber
Ja, diese abers...

Das Stundenkonto platz
Wenn Du einmal PowerShell beherrschst, geht ja alles viel schneller und einfacher.

Chef frägt warum das so ist
Schon einmal ein "Frägezeichen" gesehen? :D

Halte Dich Kollege @em-pie's Beitrag, dann wird das alles gut. face-smile

Gruß
7426148943
7426148943 14.07.2023 aktualisiert um 09:12:19 Uhr
Goto Top
mcNewbie
mcNewbie 14.07.2023 um 09:49:12 Uhr
Goto Top
Ich habe jetzt ein wenig rumgespielt.

Und bekomme jetzt auch schon ein paar Ergebnisse.

$groups = Get-adgroup -Filter * | %{$_.SamAccountName}

Problem jetzt, ich brauche nicht den vollständigen SamAccountName
sondern nur den letzten Teil!

Aufgebaut ist dieser so

Text_Text_Zahlen
6376382705
6376382705 14.07.2023 um 09:50:40 Uhr
Goto Top
Ich habe jetzt ein wenig rumgespielt.
Das machst Du aber vorbildlich in einer Testumgebung, richtig?

Falls nicht:
Du arbeitest am offenen Herz. Zerschießt Du damit dein AD, .. wird dein Chef noch stinkiger.
Schieß nicht einfach irgendwelche Scripte über den AD.. Das wirst Du bereuen, eines Tages.

..nur gut gemeint.

Gruß
7426148943
7426148943 14.07.2023 aktualisiert um 10:00:35 Uhr
Goto Top
ich brauche nicht den vollständigen SamAccountName
sondern nur den letzten Teil!
....... | %{$_.SamAccountName.split("_")[-1]}  

Leute, es ist Freitag, da kann man nicht viel erwarten face-big-smile
mcNewbie
mcNewbie 14.07.2023 um 09:59:27 Uhr
Goto Top
Zitat von @6376382705:

Ich habe jetzt ein wenig rumgespielt.
Das machst Du aber vorbildlich in einer Testumgebung, richtig?

Falls nicht:
Du arbeitest am offenen Herz. Zerschießt Du damit dein AD, .. wird dein Chef noch stinkiger.
Schieß nicht einfach irgendwelche Scripte über den AD.. Das wirst Du bereuen, eines Tages.

..nur gut gemeint.

Gruß

Die Umgebung in der ich mich befinde ist noch nicht produktiv im Einsatz. Soll es aber ab Oktober sein.
mayho33
mayho33 14.07.2023 aktualisiert um 10:14:57 Uhr
Goto Top
Zitat von @mcNewbie:
$groups = Get-adgroup -Filter * | %{$_.SamAccountName}

So kompliziert muss es nicht sein. Du kannst auch folgenden Befehl nutzen:
Get-ADGroup -Identity "Der name der AD-Grupper"  

Daraus bekommst du ein so genanntes Object. Powershell gibt alles als Object zurück. In diesem Fall schaut das in etwa so aus:
ad ausw

Problem jetzt, ich brauche nicht den vollständigen SamAccountName
sondern nur den letzten Teil!
Der letzte Teil ist was genau? Kannst du uns ein Beispiel posten?

EDIT:

Ach! Jetzt habe ich verstanden was du willst. Mach es doch so:
Get-ADGroup -Filter "*" | select SamAccountName  
#oder so 
Get-ADGroup -Filter 'SamAccountname -eq "Deine AD-Gruppe"'  

Und weil du bei dieser Variante auch den Header bekommst und deser auch in dern $groups-Variable gespeichert wird umgehst du das Problem gleich an der Wurzel wie folgt:
(Get-ADGroup -Filter "*" | select SamAccountName).SamAccountName  

#So bekommst du alle Properties die mit sam beginnen, gibst aber nur SamAccountName aus
(Get-ADGroup -Filter "*" | select Sam*).SamAccountName  

#So bekommst du wirklich alle Properties:
Get-ADGroup -Filter 'SamAccountname -eq "Deine AD-Gruppe"' -Properties *  
$groups = Get-ADGroup -Filter 'SamAccountname -like "*"' -Properties *  
Kraemer
Kraemer 14.07.2023 um 10:10:07 Uhr
Goto Top
Zitat von @7426148943:

Leute, es ist Freitag, da kann man nicht viel erwarten face-big-smile

richtig. Kann man mal wieder alternativen aufzeigen face-wink

....... | %{[RegEx]::New('.+_.+_(\d+)').Match($_.SamAccountName).Groups[1].Value}  
mcNewbie
mcNewbie 14.07.2023 um 11:33:28 Uhr
Goto Top
Ordner werden mit Korrektem Namen angelegt!

Jetzt wollte ich die korrekten Berechtigungen mit den jeweiligen AD Gruppen auf die Ordner setzen! Was auch in der Regel nicht so schwer ist, aber ich habe ja die AD Gruppe oben soweit "beschnitten" das ich diese nicht mehr hernehmen kann.
Wie kann man sowas lösen?
Ich würde es auf diesem weg in meiner "foreach" Schleife versuchen:

foreach ($folder in $groups){
$folderpath = "$filepath\$folder"
if (!(Test-Path $folder)){
New-Item $folderpath -ItemType directory

icacls "$folderpath" /grant ""$env:USERDOMAIN\abcde_lw_$facility"face-sadM)"


}}
7426148943
7426148943 14.07.2023 aktualisiert um 11:46:59 Uhr
Goto Top
Jetzt wollte ich die korrekten Berechtigungen mit den jeweiligen AD Gruppen auf die Ordner setzen!
Lies meinen Link oben, da steht wie man es gleich richtig mit Set-ACL und einer FileSystemAccessRule macht. icacls in Powershell is ehrlich gesagt bäh hoch drei dann brauch ich ja kein Powershell ...
Kann man per Powershell Benutzer-Ordner aus vorhandenen AD Konten erzeugen?
mcNewbie
mcNewbie 14.07.2023 um 12:53:08 Uhr
Goto Top
Zitat von @7426148943:

Jetzt wollte ich die korrekten Berechtigungen mit den jeweiligen AD Gruppen auf die Ordner setzen!
Lies meinen Link oben, da steht wie man es gleich richtig mit Set-ACL und einer FileSystemAccessRule macht. icacls in Powershell is ehrlich gesagt bäh hoch drei dann brauch ich ja kein Powershell ...
Kann man per Powershell Benutzer-Ordner aus vorhandenen AD Konten erzeugen?

Danke für deinen Tip, habs etz mal umgesetzt

Sieht folgendermaßen aus:

$filePath = "C:\install\P\"
$groups = Get-adgroup -Filter "Name -like 'abcde_lw_*'" | %{$_.SamAccountName.split("_")[-1]}


foreach ($folder in $groups){
$folderpath = "$filepath\$folder"
if (!(Test-Path $folder)){
New-Item $folderpath -ItemType directory | Out-Null

$acl = Get-Acl $folderpath
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($groups.SamAccountName, "Read")
$acl.SetAccessRule($objACE)
Set-Acl -Path $folderpath -AclObject $acl


}
}

Jetzt bekomme ich folgende meldungen:
New-Object : Für "FileSystemAccessRule" und die folgende Argumenteanzahl kann keine Überladung gefunden werden: "2".
In Zeile:2 Zeichen:23

back-to-top... $objACE = New-Object System.Security.AccessControl.FileSystemAccess ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [New-Object], MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Ausnahme beim Aufrufen von "SetAccessRule" mit 1 Argument(en): "Der Wert darf nicht NULL sein.
Parametername: rule"
In Zeile:3 Zeichen:13

back-to-top$acl.SetAccessRule($objACE)

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException
7426148943
7426148943 14.07.2023 aktualisiert um 13:09:27 Uhr
Goto Top
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($groups.SamAccountName, "Read","ContainerInherit,ObjectInherit","None","Allow")
fehlt ja die Hälfte, schau dir die Parameter der FilesystemAccessRule noch mal genau an, genau das sagt übrigens die Fehlermeldung schon, dir fehlen die Parameter unter anderem auch für AccessControlType welcher aussagt ob mit der Regel Erlaubt oder Verboten werden soll(Allow/Deny) ...
und die folgende Argumenteanzahl kann keine Überladung gefunden werden: "2"
Du kannst nicht einfach Parameter des Konstruktors weglassen nur weil du meinst du brauchst sie nicht oder sie nicht verstehst face-big-smile.
em-pie
em-pie 14.07.2023 um 13:00:43 Uhr
Goto Top
ändere deine Beiträge mal bitte dahingehend, dass du um die Code-Zeilen herum mit den Code-Tags arbeitest (ohne die Leerzeichen an den spitzen Klammern)

< code >Mein Code< /code >
mcNewbie
mcNewbie 14.07.2023 um 13:36:36 Uhr
Goto Top
Zitat von @7426148943:

$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($groups.SamAccountName, "Read","ContainerInherit,ObjectInherit","None","Allow")
fehlt ja die Hälfte, schau dir die Parameter der FilesystemAccessRule noch mal genau an, genau das sagt übrigens die Fehlermeldung schon, dir fehlen die Parameter unter anderem auch für AccessControlType welcher aussagt ob mit der Regel Erlaubt oder Verboten werden soll(Allow/Deny) ...
und die folgende Argumenteanzahl kann keine Überladung gefunden werden: "2"
Du kannst nicht einfach Parameter des Konstruktors weglassen nur weil du meinst du brauchst sie nicht oder sie nicht verstehst face-big-smile.


Ich hab die Sachen weggelassen, da ich sie ganz einfach nicht brauch(falls wir vom gleichen reden).

Ich habe ja im Moment nichts mit Vor- und Nachnamen zu tun, sondern mit Verzeichnissgruppen.
7426148943
7426148943 14.07.2023 aktualisiert um 13:44:51 Uhr
Goto Top
Zitat von @mcNewbie:
Ich hab die Sachen weggelassen, da ich sie ganz einfach nicht brauch(falls wir vom gleichen reden).
Doch du brauchst sie, du darfst sie nicht weglassen, und genau das sagt dir die Fehlermeldung .... Die möglichen Konstruktoren sind fest definiert RTFM !!
Der kleinste Konstruktor beinhaltet zumindest noch den AccessControlType, also "Allow", oder "Deny"!
https://learn.microsoft.com/de-de/dotnet/api/system.security.accesscontr ...
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($groups.SamAccountName, "Read","Allow")  
mcNewbie
mcNewbie 14.07.2023 um 13:47:34 Uhr
Goto Top
Zitat von @7426148943:

Zitat von @mcNewbie:
Ich hab die Sachen weggelassen, da ich sie ganz einfach nicht brauch(falls wir vom gleichen reden).
Doch du brauchst sie, du darfst sie nicht weglassen, und genau das sagt dir die Fehlermeldung .... Die möglichen Konstruktoren sind fest definiert RTFM !!
Der kleinste Konstruktor beinhaltet zumindest noch den AccessControlType, also "Allow", oder "Deny"!
https://learn.microsoft.com/de-de/dotnet/api/system.security.accesscontr ...
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($groups.SamAccountName, "Read","Allow")  


Habs mal ausgebessert:


$acl = Get-Acl $folderpath
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($folder.SamAccountName,"FullControl","ContainerInherit,ObjectInherit","None","Allow")
$acl.SetAccessRule($objACE)
Set-Acl -Path $folderpath -AclObject $acl


Fehler kommen wie folgt, iwie wird meine $objACE nicht befüllt.

New-Object : Ausnahme beim Aufrufen von ".ctor" mit 5 Argument(en): "Der Wert darf nicht NULL sein.
Parametername: identity"
In C:\Users\Administrator.DRSKITA\Downloads\Unbenannt7.ps1:11 Zeichen:23

back-to-top... $objACE = New-Object System.Security.AccessControl.FileSystemAccess ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Ausnahme beim Aufrufen von "SetAccessRule" mit 1 Argument(en): "Der Wert darf nicht NULL sein.
Parametername: rule"
In C:\Users\Administrator.DRSKITA\Downloads\Unbenannt7.ps1:12 Zeichen:13

back-to-top$acl.SetAccessRule($objACE)

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException
7426148943
Lösung 7426148943 14.07.2023 aktualisiert um 13:54:57 Uhr
Goto Top
Ist ja auch klar warum denn $folder.SamAccountName gibt es nicht, das hast du vorher nur zum Ordnernamen expandiert und deswegen keine Property der Variablen mehr face-wink.
$filePath = "C:\install\P"  
$groups = Get-adgroup -Filter "Name -like 'abcde_lw_*'"  

foreach ($group in $groups){
    $foldername = $group.SamAccountName.split("_")[-1]  
    $folderpath = Join-Path $filepath $foldername

    if (!(Test-Path $folderpath)){
        New-Item $folderpath -ItemType directory | Out-Null
    }

    $acl = Get-Acl $folderpath
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($group.SamAccountName, "Read","ContainerInherit,ObjectInherit","None","Allow")  
    $acl.SetAccessRule($objACE)
    Set-Acl -Path $folderpath -AclObject $acl
}
mcNewbie
mcNewbie 14.07.2023 um 13:53:57 Uhr
Goto Top
Zitat von @7426148943:

Ist ja auch klar warum denn $folder.SamAccountName gibt es nicht, das hast du vorher nur zum Ordnernamen expandiert face-wink.


Richtig! Das weiß ich auch, hab ich glaub ich weiter oben sogar geschrieben. Habs trotzdem einfach mal stupide versucht...

Würde es helfen, wenn ich einfach ne neue get-adgroup variable mache?
7426148943
7426148943 14.07.2023 aktualisiert um 13:58:48 Uhr
Goto Top
s. ergänzter Code im letzten Kommentar ...
mcNewbie
mcNewbie 14.07.2023 um 14:20:09 Uhr
Goto Top
Zitat von @7426148943:

s. ergänzter Code im letzten Kommentar ...


Sorry, habe meinen Post abgesetzt und bin dann in ein anderes Fenster gesprungen!

Aber es klappt soweit. Ich danke dir vielmals! Wo soll ich das Bier hinschicken?
7426148943
7426148943 14.07.2023 um 15:28:15 Uhr
Goto Top
Geht aufs Haus face-smile.
mcNewbie
mcNewbie 18.07.2023 um 11:17:26 Uhr
Goto Top
Das mit den ACL´s is echt feine Sache und klappt auch erstaunlich gut!
Habe die ACL´s noch um ein löschen verweigern erweitert.....


Jetzt muss ich mich dran machen, die Ordner darunter zu erstellen und entsprechend zu berechtigen.
Was natürlich nicht so einfach ist, da die Ordner nicht Anhand eines namens einer AD Gruppe erstellt werden, sondern nach Tätigkeit und die dazu passende AD Berechtigungsgruppe komplett anders heißt.......


Als zusätzliche Aufgabe möchte ich auch noch gleich ein kleines Log ausgeben lassen, welche mir die erstellten Ordner auflistet, aber dass kommt zum Schluss wenn alles klappt!