Получить список локальных профилей с powershell - PullRequest
0 голосов
/ 05 ноября 2018

Я на Windows Server 2008 R2 и мне нужна выдержка из списка локальных профилей, поэтому я использую Powershell, чтобы заглянуть в реестр и получить то, что я хочу:

$path = 'Registry::HKey_Local_Machine\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\*'
$items = Get-ItemProperty -path $path 
Foreach ($item in $items) {
$objUser = New-Object 
System.Security.Principal.SecurityIdentifier($item.PSChildName)
$objName = $objUser.Translate([System.Security.Principal.NTAccount])
$item.PSChildName = $objName.value
}
echo $items | Select-Object -Property PSChildName | Export-Csv 
C:\scripts\PSScripts\UserProfile.csv -Encoding UTF8

Он работал с другой машиной, использующей Windows Server 2012 R2, но здесь я получил много ошибок, но всегда одна и та же:

Исключение вызывает "Translate" с аргументом (ами) "1": "Некоторые или все" ссылки на личность не могут быть переведены. C: \ scripts \ PSScripts \ users_profile.ps1: 5 char: 34 + $ objName = $ objUser.Translate <<<< ([System.Security.Principal.NTAccount]) + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException </p>

Файл .csv создан, но с проблемами, такими как профиль, отображаемый более одного раза, например:

DOMAIN\User1
DOMAIN\User2
DOMAIN\User3
DOMAIN\User3
DOMAIN\User4
DOMAIN\User5
DOMAIN\User5
DOMAIN\User5
DOMAIN\User6

Есть ли разница между WS2008 и WS2012, которая может вызвать эту проблему? Или это что-то еще?

1 Ответ

0 голосов
/ 05 ноября 2018

Я бы посоветовал использовать WMI для согласованности на разных платформах, а также немного обработать ошибки:

$path = 'C:\scripts\PSScripts\UserProfile.csv'

Get-CimInstance -ClassName Win32_UserProfile -Filter Special=FALSE -PipelineVariable user |
    ForEach-Object -Begin {$ErrorActionPreference = 'Stop'} {
        try
        {
            $id = [System.Security.Principal.SecurityIdentifier]::new($user.SID)
            $id.Translate([System.Security.Principal.NTAccount]).Value
        }
        catch
        {
            Write-Warning -Message "Failed to translate $($user.SID)! $PSItem"
        }
    } |
    Select-Object -Property @{Label='PSChildName'; Expression={$PSItem}} |
    Export-Csv -Path $path -Encoding ascii -NoTypeInformation

Решение PSv2:

Get-WmiObject -Class Win32_UserProfile -Filter Special=FALSE |
    ForEach-Object -Begin {$ErrorActionPreference = 'Stop'} {
        try
        {
            $sid = $_.SID
            $id = New-Object -TypeName System.Security.Principal.SecurityIdentifier -ArgumentList $sid
            $id.Translate([System.Security.Principal.NTAccount]).Value
        }
        catch
        {
            Write-Host "Failed to translate $sid! $_" -ForegroundColor Red
        }
    } |
    Select-Object -Property @{Label='PSChildName'; Expression={$_}} |
    Export-Csv -Path $path -Encoding ascii -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...