Создание массива профилей с помощью 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)

Любые идеи?

ТИА!


person ESS    schedule 01.12.2014    source источник


Ответы (2)


Похоже, вы перезаписываете содержимое $array на каждой итерации вашего цикла 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 не сбалансированы, и мы не знаем, как заполняется этот раскрывающийся список), так что позже может быть что-то, что вас запутало.

person alroc    schedule 01.12.2014
comment
Это сработало отлично. В раскрывающемся списке теперь перечислены все профили пользователей. Мне просто нужно знать, как фильтровать, чтобы показывать только доменные! Большое спасибо... Я пытался заставить его работать около 3 дней! - person ESS; 01.12.2014
comment
Одним из решений будет if($objuser.value -match 'DOMAIN\\') { $array += @($objuser) } - person Frode F.; 01.12.2014

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

$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)
person Frode F.    schedule 01.12.2014
comment
Спасибо, оба предложения работают. Очень ценю вас обоих! - person ESS; 01.12.2014