2014-12-01 2 views
0

Я все еще изучаю основы powershell, но я столкнулся с проблемой, которую я не могу решить, поскольку у меня просто недостаточно знаний.Создание массива профилей с powershell

Я создаю скрипт для миграции профиля пользователя и хочу, чтобы код собирал профили с локальной машины, преобразовывал SID обратно в имена пользователей и перечислил их в раскрывающемся списке (который работает), но только списки один пользователь. У меня есть следующее:

$Profiles = gwmi -Class Win32_UserProfile -Filter ("Special = False") 
$output = foreach ($Profile in $Profiles) 
{ 
try 
{ 
$objSID = New-Object System.Security.Principal.SecurityIdentifier($profile.sid) 
$objuser = $objsid.Translate([System.Security.Principal.NTAccount]) 
$objusername = $objuser.value 
} 
catch 
{ 
$objusername = $profile.sid 
} 
Write-Host $objuser.value 
$array = @($objuser) 

Любые идеи?

TIA!

ответ

0

Кажется, что вы переписываете содержимое массива $ на каждой итерации своего цикла foreach. Вместо этого добавьте его.

foreach ($Profile in $Profiles) 
{ 
try 
{ 
$objSID = New-Object System.Security.Principal.SecurityIdentifier($profile.sid) 
$objuser = $objsid.Translate([System.Security.Principal.NTAccount]) 
$objusername = $objuser.value 
} 
catch 
{ 
$objusername = $profile.sid 
} 
Write-Host $objuser.value 
$array += @($objuser) 
} 

Возможно, я ошибаюсь. Здесь вы вставили только часть своего скрипта (скобки для foreach не сбалансированы, и мы не понимаем, как заполняется этот раскрывающийся список), так что может быть что-то позже, что вы заблуждаетесь.

+0

Это сработало отлично. В раскрывающемся списке перечислены все профили пользователей. Мне просто нужно знать, как фильтровать только показ доменных! Большое спасибо ... Я занимался попыткой заставить его работать около 3 дней! – ESS

+0

Одним из решений будет 'if ($ objuser.value -match 'DOMAIN \\') {$ array + = @ ($ objuser)}' –

0

См. Комментарии в коде.

$Profiles = gwmi -Class Win32_UserProfile -Filter ("Special = False") 
#You never output anything in your foreach-loop, so $output will be empty.. Removed Write-Host later in code to fix this 
$output = foreach ($Profile in $Profiles) { 
    try 
    { 
     $objSID = New-Object System.Security.Principal.SecurityIdentifier($profile.sid) 
     $objuser = $objsid.Translate([System.Security.Principal.NTAccount]) 
     $objusername = $objuser.value 
    } 
    catch 
    { 
     $objusername = $profile.sid 
    } 

    #You've already saved "objuser.value to a variable... use it.. :) Also, You're catching returned objects with $output = foreach, so I'd suggest outputing the usernames and not just write them to the console. Replace `Write-Host $objuser.value` with `$objusername` 
    $objusername 

#You never closed your foreachloop. Added } 
} 

#Output collected usernames 
$output 

#This will always overwrite $array with a new array containing one user, objuser, only. Removed 
#$array = @($objuser) 
+0

Спасибо, оба предложения работают. Большое спасибо вам обоим! – ESS