sirroobzsen
Goto Top

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

Content-Key: 305762

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

Printed on: May 10, 2024 at 15:05 o'clock

Member: emeriks
emeriks May 31, 2016 at 07:56:41 (UTC)
Goto Top
Hi,
geht es ums Skripten oder um das Ergebnis? Falls nur letzteres, dann könnte Jose was für Dich sein.

E.
Member: Sirroobzsen
Sirroobzsen May 31, 2016 at 08:03:36 (UTC)
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
Member: colinardo
Solution colinardo May 31, 2016 updated at 09:04:18 (UTC)
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
Member: colinardo
Solution colinardo May 31, 2016 updated at 09:06:05 (UTC)
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