3 votes

Obtenir les répertoires personnels des utilisateurs de manière récursive dans PowerShell

Donc, je fais le plongeon dans PowerShell. J'ai été chargé de refaire les permissions sur chaque dossier personnel du domaine (ils ne relèvent pas tous du même sous-répertoire - ce serait trop facile). J'ai un lot script écrit qui prend deux paramètres : le nom de l'utilisateur, et le chemin du dossier personnel et les pompe à travers SetACL.

Je veux utiliser PowerShell pour obtenir les noms d'utilisateurs et les dossiers personnels de chaque utilisateur dans une OU. Jusqu'à présent, j'ai pu obtenir les noms d'utilisateur, mais je n'arrive pas à trouver comment obtenir les répertoires personnels.

Voici mon PowerShell jusqu'à présent (emprunté à diverses sources sur le web) :

$Dom = "LDAP://OU=Accounts,DC=myDomain,DC=local"
$Root = New-Object DirectoryServices.DirectoryEntry $Dom

# Create a selector and start searching from the Root of AD
$selector = New-Object DirectoryServices.DirectorySearcher
$selector.SearchRoot = $root
$Selector.pagesize = 20000

# Basically this will only grab user accounts and not computer accounts.
$adobj= $selector.findall() | where {
    $_.properties.objectcategory -match "CN=Person*"
}
foreach ($person in $adobj) {
    $prop=$person.properties
    Write-host "$($prop.cn)"
}

Je vais éventuellement intégrer la ligne Write-host dans le fichier batch setACL, mais je me contente pour l'instant d'écrire la sortie pour m'assurer qu'elle est exacte. J'ai essayé d'ajouter $($prop.homeDirectory) à la ligne Write-host, sans succès.

Des conseils ou des suggestions ?

6voto

jscott Points 23974

Microsoft a mis à jour son module powershell Active Directory et il est inclus dans RSAT. Si vous ne souhaitez pas utiliser les modules d'une tierce partie, voici la liste des modules de sAMAaccountName y homeDirectory pour tous les utilisateurs de l'OU "JustAnOrgUnit". C'est à peu près la même chose que la réponse de @nimizen, mais sans l'exigence de Quest.

Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=JustAnOrgUnit,DC=example,DC=com" -Filter * -Property * |
    Select-Object -Property sAMAccountName,homeDirectory |
        Export-CSV -Path C:\somefile.csv

2voto

nimizen Points 276

Utilisez les cmdlets AD de Quest, ils sont gratuits et simplifient vraiment ce genre de choses.

Vous pouvez les obtenir auprès de http://www.quest.com/powershell/activeroles-server.aspx

Une fois que vous les avez chargés, essayez le script suivant, mais lisez aussi le cmdlet Get-QADUser.

$csvfile = "C:\somefile.csv"
$root = "OU=Accounts,DC=myDomain,DC=local"
get-qaduser -SearchRoot $root `
-ObjectAttributes @{homeDirectory=’*'} -IncludeAllProperties | `
Select-Object LogonName,HomeDirectory | `
Export-Csv $csvfile

1voto

danijeljw-RPC Points 51

Voici comment le mettre à jour sur chaque homeDirectory sans utiliser plusieurs outils, et parcourir chaque compte un par un à partir d'une OrgUnit et récursivement à travers chaque subOU aussi.

# source ACL required
$NewAcl = Get-Acl -Path "C:\directory\as\template"

# load active directory powershell module (requires RSAT installed)
Import-Module -Name ActiveDirectory -Force

# get all AD Users in OU from example, then set new Acl from source directory on their home directory paths
Get-ADuser -Filter * -SearchBase "OU=Accounts,DC=myDomain,DC=local" -Properties homeDirectory | ForEach-Object {
    $homedir = $_.'homeDirectory'
    try {
        # set acl settings
        Set-Acl -Path $homedir -AclObject $NewAcl -Confirm:$false -ErrorAction Stop
        # write output to console if successful
        Write-Output "Successfully updated ACL settings for ${homedir}"
    }
    catch {
        Write-Output "Unable to update ACL settings on ${homedir}"
    }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X