2016-12-20 3 views
0

Задача кажется тривиальной! Многие пользователи приходят и уходят в нашу среду. Время от времени я хочу проверить папки «роуминг» для «сирот» и избавиться от них. Мой код работает, если имя пользователя точно совпадает с именем папки, но не для папок, где Windows добавила .V2, .V3 и т. Д. Например. -eq работает, но не-like или -contains, или любой из способов, которые я пытался вставить подстановочный знак. Я попытался построить объект-объект и не смог.Использование Powershell для очистки сирот Папки профиля пользователя Active Directory

Например, если у нас есть пользователь bob.smith, я не хочу, чтобы мой список «сирот» включал папки профилей с именем bob.smith или bob.smith.V2.

Вот мой код:

# 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 " " 

ответ

1

Изменения первой линия:

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

Придумал лучшим решением. Он использует RegEx для разделения расширения .V2 на имя папки и поэтому проверяет имя без этого ext. Промежуточные $ profilefolders не требуются.

# 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

Удивительный! Первый ответ работает, второй генерирует кучу красного цвета, начиная с! на линии 8. Там есть куча вещей, которые я не понимаю, поэтому я буду читать. Большое спасибо за повышение на кривой обучения. – SKaye

+0

Drat! # 1 - это не ответ: я не хочу игнорировать каждую папку с добавлением .Vx, просто игнорирую часть .Vx. – SKaye

+0

@SKaye Я изменил второй скрипт на наличие дополнительной пары круглых скобок с помощью оператора '!' Not. У меня дома нет дома, поэтому он не может его протестировать. – LotPings

0

Огромное спасибо @LotPings. Вот мой код сейчас (со всеми отладчиками):

# 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 " " 
Смежные вопросы