如何在PowerShell中将SID转换为帐户名?

时间:2014-03-11 17:06:21

标签: .net security powershell

此问题的灵感来自this similar question使用C#标记。如果我有一个Windows SID,并希望将其转换为可读的帐户名,我怎样才能使用PowerShell而不是C#实现这一目标?

现在,我有以下代码,它检索当前登录用户帐户的组成员身份:

$Identity = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$Identity.Groups;

Groups属性的结果不会给我任何帐户名,只有SID。如果我将Groups属性的输出传递给PowerShell的Get-Member cmdlet,我可以看到生成的对象是System.Security.Principal.SecurityIdentifier个对象。但是,查看Groups属性的the documentation(和智能感知)会显示它正在返回IdentityReferenceCollection个对象。

如何将这些SecurityIdentifier个对象转换为专有名称?

3 个答案:

答案 0 :(得分:7)

将SID解析为帐户名称的一种方法是使用Win32_SID类:

PS C:\> $sid = 'S-1-5-18'
PS C:\> [wmi]"Win32_SID.SID='$sid'"


__GENUS              : 2
__CLASS              : Win32_SID
__SUPERCLASS         :
__DYNASTY            : Win32_SID
__RELPATH            : Win32_SID.SID="S-1-5-18"
__PROPERTY_COUNT     : 5
__DERIVATION         : {}
__SERVER             : CARBON
__NAMESPACE          : root\cimv2
__PATH               : \\CARBON\root\cimv2:Win32_SID.SID="S-1-5-18"
AccountName          : SYSTEM
BinaryRepresentation : {1, 1, 0, 0...}
ReferencedDomainName : NT-AUTHORITY
SID                  : S-1-5-18
SidLength            : 12
PSComputerName       : CARBON

答案 1 :(得分:6)

解决方案是使用Translate() methodSecurityIdentifier class。此方法的单个参数是对要将SecurityIdentifier转换为的.NET类型的引用。如果您对类似的C#问题进行this answer检查,您会看到只需传入对System.Security.Principal.NTAccount class的引用。

结果代码如下所示:

$Identity = [System.Security.Principal.WindowsIdentity]::GetCurrent();
foreach ($Group in $Identity.Groups) {
    $Group.Translate([System.Security.Principal.NTAccount]).Value;
}

答案 2 :(得分:2)

看起来你已经有了答案 - 我在不久前写了一个包装器,如果有帮助的话,还会搜索well known SIDs列表。 ConvertFrom-SID

你可以解决这个问题的一般方法如下,其中$ sid包含一个SID字符串:

$sid = '<SIDGoesHere>';
$objSID = New-Object -TypeName System.Security.Principal.SecurityIdentifier -ArgumentList $sid;
$name = $objSID.Translate([System.Security.Principal.NTAccount]).Value;

干杯!