我在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之间是否存在差异,这可能导致此问题?还是其他?
答案 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