sirroobzsen

Kann man das AD so auslesen, dass eine entsprechende Ordnerstruktur erstellt wird?

MoinMoin liebe Community,

folgende Aufgabenstellung liegt mir vor:
Ich soll per Powershell sämtliche Ordner/OUs, sowie Benutzer aus dem AD auslesen und anschließend eine gleiche Ordnerhierarchie per mkdir erstellen.

Ich habe bisher folgende 2 Scripte erstellt:

1. zum auslesen der Benutzer -> es werden lediglich die Ordner erstellt:

Import-Module ActiveDirectory 
$rootPath = 'C:/test/'   
$users = Get-Aduser -Filter * | ?{$_.Surname -ne $null -and $_.Givenname -ne $null} 

foreach($user in $users){ 
    $userFolder = "$rootPath\$($user.GivenName).$($user.Surname)"   

    if (!(Test-Path $userFolder)){ 
        Write-Host "Erstelle Ordner für User '$($user.SamAccountName)' ($userfolder)" -ForegroundColor Green   

        md $userFolder -Force | Out-Null 
        $acl = Get-Acl $userFolder 
        $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($user.SamAccountName,"FullControl","ContainerInherit,ObjectInherit","None","Allow")   
        $acl.SetAccessRule($objACE) 
        set-acl -Path $userFolder -AclObject $acl 
    }else{ 
        write-host "Ordner für User '$($user.SamAccountName)' existiert schon" -ForegroundColor DarkYellow   
   } 
}


und 2.
ein script welches die OUs ausliest und anlegt, jedoch nicht in den richtigen Unterordnern, es wird zzt noch alles einfach im root angelegt.

Get-ADOrganizationalUnit -SearchBase $OU -SearchScope Subtree -Filter * | 
    Select-Object Name | Foreach {mkdir c:\test\$_}


  $pfad = 'C:\test'  
Get-ChildItem $pfad -Recurse | 
  ForEach-Object {
    if( $_.FullName -match "@{Name=")  
    {
      $newName = $_.FullName -replace"@{Name="  
      Rename-Item $_.FullName $newName
    }
  }

    $pfad = 'C:\test'  
Get-ChildItem $pfad -Recurse | 
  ForEach-Object {
    if( $_.FullName -match "}")  
    {
      $newName = $_.FullName -replace"}"  
      Rename-Item $_.FullName $newName
    }
  }


Nun scheitert es bei der Zusammenführung bzw. dem Erstellen der Ordner im richtigen Verzeichnis bzw. parentdirectory. Hat jemand eine Idee?


Lieben Gruß,
Robert

und schon mal vielen Dank für sämtliche Antworten/Hilfestellungen
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 305762

Url: https://administrator.de/forum/kann-man-das-ad-so-auslesen-dass-eine-entsprechende-ordnerstruktur-erstellt-wird-305762.html

Ausgedruckt am: 29.04.2025 um 07:04 Uhr

emeriks
emeriks 31.05.2016 um 09:56:41 Uhr
Goto Top
Hi,
geht es ums Skripten oder um das Ergebnis? Falls nur letzteres, dann könnte Jose was für Dich sein.

E.
Sirroobzsen
Sirroobzsen 31.05.2016 um 10:03:36 Uhr
Goto Top
Geht hier eher um das Skripten, sollte ebenfalls mit Powershell gelöst werden falls möglich.
Jose schaut trotzdem interessant aus, werde ich mir bei Gelegenheit auch mal anschauen face-smile

Gruß,
Robert
colinardo
Lösung colinardo 31.05.2016 aktualisiert um 11:04:18 Uhr
Goto Top
Hallo Robert,
das kann man auf mehrere Arten machen.
  • Eine Variante ist das durchlaufen der OUs mit einer Rekursiven Funktion
  • Eine andere wäre es über den CanonicalName der OU zu machen und die Slashes durch Backslashes zu ersetzen.

Erstere Variante habe ich dir hier mal hier skizziert:
Import-Module ActiveDirectory

# Funktion erstellt Benutzerordner für alle Benutzer einer OU (OneLevel)
function Add-UserFolders([string]$OU,[string]$physicalPath){
    $users = Get-Aduser -Filter * -SearchBase $OU -SearchScope OneLevel | ?{$_.Surname -ne $null -and $_.Givenname -ne $null} 

    foreach($user in $users){ 
        $userFolder = "$physicalPath\$($user.GivenName).$($user.Surname)"   

        if (!(Test-Path $userFolder)){ 
            Write-Host "Erstelle Ordner für User '$($user.SamAccountName)' ($userfolder)" -ForegroundColor Green   

            md $userFolder -Force | Out-Null 
            $acl = Get-Acl $userFolder 
            $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($user.SamAccountName,"FullControl","ContainerInherit,ObjectInherit","None","Allow")   
            $acl.SetAccessRule($objACE) 
            set-acl -Path $userFolder -AclObject $acl 
        }else{ 
            write-host "Ordner für User '$($user.SamAccountName)' existiert schon" -ForegroundColor DarkYellow   
       } 
    }
}

# Rekursive Funktion zum Erstellen der Verschachtelung
Function Create-OUStructure([string]$BaseOU,$BaseFolder){
    # Benutzer der OU erstellen
    Add-UserFolders $BaseOU $BaseFolder
    # Für alle OUs innerhalb dieser OU rufe die Funktion rekursiv erneut auf
    Get-ADOrganizationalUnit -Filter * -SearchBase $BaseOU -SearchScope OneLevel | %{
        Create-OUStructure $_.DistinguishedName "$BaseFolder\$($_.Name)"  
    }
}

# Struktur erstellen
Create-OUStructure 'OU=Verwaltung,dc=contoso,dc=com' 'C:\RootOrdner'  
Grüße Uwe
colinardo
Lösung colinardo 31.05.2016 aktualisiert um 11:06:05 Uhr
Goto Top
Und als Ergänzung noch die zweite Variante die ich oben genannt habe, welche die Ordnerverschachtelung über den Canonical-Name extrahiert:
(Zeile 6 macht hier die eigentliche Arbeit)
Import-Module ActiveDirectory
function Add-UserFolders([string]$physicalPath){
    $users = Get-Aduser -Filter * -Properties CanonicalName | ?{$_.Surname -ne $null -and $_.Givenname -ne $null} 

    foreach($user in $users){ 
        $subpath = ($user.CanonicalName -replace '^[^/]+/(.*?)/[^/]+$','$1') -replace '/','\'  
        $userFolder = "$physicalPath\$subpath\$($user.GivenName).$($user.Surname)"   

        if (!(Test-Path $userFolder)){ 
            Write-Host "Erstelle Ordner für User '$($user.SamAccountName)' ($userfolder)" -ForegroundColor Green   

            md $userFolder -Force | Out-Null 
            $acl = Get-Acl $userFolder 
            $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($user.SamAccountName,"FullControl","ContainerInherit,ObjectInherit","None","Allow")   
            $acl.SetAccessRule($objACE) 
            set-acl -Path $userFolder -AclObject $acl 
        }else{ 
            write-host "Ordner für User '$($user.SamAccountName)' existiert schon" -ForegroundColor DarkYellow   
       } 
    }
}

Add-UserFolders 'C:\RootOrdner'  

So das sollte dir jetzt eigentlich alles liefern was du brauchst face-smile

Grüße Uwe