2016-12-20 18 views
0

La tâche semble triviale! Beaucoup d'utilisateurs vont et viennent dans notre environnement. De temps en temps, je veux vérifier les dossiers de profil itinérants "orphelins" et se débarrasser d'eux. Mon code fonctionne si le nom d'utilisateur correspond exactement au nom du dossier, mais pas pour les dossiers où Windows a ajouté un fichier .V2, .V3, etc. -eq fonctionne mais pas-comme ou -contains, ou l'une des façons dont j'ai essayé d'insérer un caractère générique. J'ai essayé une construction d'où-objet et échoué aussi bien. Par exemple, si nous avons un utilisateur bob.smith, je ne veux pas que ma liste "orpheline" inclue des dossiers de profil nommés bob.smith ou bob.smith.V2.Utilisation de Powershell pour nettoyer les dossiers de profil utilisateur Active Directory orphelins

Voici mon code:

# Put profile folder names in array 

$profilefolders = Get-ChildItem -Name "\\server\profiles$" 



# Initialize arrays 

$orphanprofiles = @() 



foreach ($userprofile in $profilefolders) 
    { 
# Do profile names match up with user accounts? 
    If(Get-ADUser -Filter {SamAccountName -eq $userprofile}) 

     { 
     # User account exists: no action 
     } 

    Else 
     { 
     # Profile is an orphan. Add to list. 
     $orphanprofiles += $userprofile 
         } 
       } 




# put array values in a string variable with newline char for screen output 
$outputprofiles = $orphanprofiles -join "`n" 

Write-Output "`n" 
Write-Output "Orphan profiles: `n$outputprofiles" 
Write-Output " " 

Répondre

1

Modifier la première ligne à:

$profilefolders = Get-ChildItem -Name "\\server\profiles$"|where {$_ -notmach '.*\.V\d$'} 

a trouvé une meilleure solution. Il utilise un RegEx pour séparer l'extension .V2 du nom de fichier et vérifie ainsi le nom sans ext. Les $ profilefolders intermédiaires ne sont pas requis.

# Initialize arrays 
$orphanprofiles = @() 
$pattern = '^(.*?)(\.V\d)$' 

Get-ChildItem -Name "\\server\profiles$"| 
    ForEach { 
     If ($_ -match $pattern) { 
      If (!(Get-ADUser -Filter {SamAccountName -eq $matches[1]})) 
       {$orphanprofiles += $_} else {} 
     } Else { 
      If (!(Get-ADUser -Filter {SamAccountName -eq $_})) 
       {$orphanprofiles += $_} 
     } 
    } 


# put array values in a string variable with newline char for screen output 
$outputprofiles = $orphanprofiles -join "`n" 
Write-Output "`n" 
Write-Output "Orphan profiles: `n$outputprofiles" 
Write-Output " " 
+0

Génial! La première réponse fonctionne, la seconde génère un tas de rouge, en commençant par le! à la ligne 8. Il y a plein de trucs là-dedans, je ne comprends pas, je vais aller y lire. Merci beaucoup pour le coup de pouce sur la courbe d'apprentissage. – SKaye

+0

Drat! # 1 n'est pas la réponse: je ne veux pas ignorer chaque dossier avec un .Vx ajouté, juste ignorer la partie .Vx de celui-ci. – SKaye

+0

@SKaye J'ai changé le deuxième script pour avoir une paire de parenthèses supplémentaire avec l'opérateur '!' Not. N'a pas une AD à la maison, donc ne peut pas le tester. – LotPings

0

Merci beaucoup à @LotPings. Voici mon code maintenant (avec toutes les instructions de débogage):

# Initialize array 
$orphanprofiles = @() 

# set regex pattern 
$pattern = '^(.*?)(\.V\d)$' 

Get-ChildItem -Name "\\server\profiles$"| 
    ForEach { 
     Write-Host "Testfolder: " $_ 
     If ($_ -match $pattern) 
     { 
      Write-Host "Loop 1 Foldername " $_ 
      Write-Host "Loop 1 Match " $matches[1] 
      $Vnuser = $matches[1] 

      If(Get-ADUser -Filter {SamAccountName -eq $Vnuser}) 
       { 
      # match: do nothing 
       } 
       Else 
       { 
       $orphanprofiles += $_ 
       Write-Host "Loop one inside If statement: " $_ 
       } 


    } 

     Else 
     { 
      Write-Host "Folders without .Vn: " $_ 
      If(Get-ADUser -Filter {SamAccountName -eq $_}) 
       { 
       # match: do nothing 
       } 
      Else 
       { 
       $orphanprofiles += $_ 
       Write-Host "Loop 2 foldername: " $_ 
       } 

    } 

    } 



# put array values in a string variable with newline char for screen output 
$outputprofiles = $orphanprofiles -join "`n" 
Write-Output "`n" 
Write-Output "Orphan profiles: `n$outputprofiles" 
Write-Output " "