此问题的灵感来自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
个对象转换为专有名称?
答案 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()
method的SecurityIdentifier
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;
干杯!