使用Powershell获取本地配置文件列表

时间:2018-11-05 15:09:17

标签: powershell csv registry

我在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的计算机一起工作,但是在这里我遇到了很多错误,但是总是一样:

  

使用“ 1”参数调用“翻译”的异常:“部分或全部   身份参考无法翻译。”   C:\ scripts \ PSScripts \ users_profile.ps1:5 char:34   + $ objName = $ objUser.Translate <<<<([System.Security.Principal.NTAccount])   + CategoryInfo:未指定:(:) [],MethodInvocationException   + FullyQualifiedErrorId:DotNetMethodException

.csv文件已创建,但是存在问题,例如多次显示的配置文件,如下所示:

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

WS2008和WS2012之间是否存在差异,这可能导致此问题?还是其他?

1 个答案:

答案 0 :(得分:2)

我建议使用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