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

5
这个问题的灵感来自于使用C#标签的相似问题。如果我有一个Windows SID,并想将其转换为可读的账户名,我该如何使用PowerShell实现而非C#?
现在,我有以下代码,它检索当前登录用户账户的组成员身份:
$Identity = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$Identity.Groups;
Groups属性的结果只会返回SIDs,而不是任何账户名称。如果我将Groups属性的输出导入PowerShell的Get-Member命令中,我可以看到产生的对象是System.Security.Principal.SecurityIdentifier对象。但是,在查看Groups属性的文档(和Intellisense)时,显示它返回的是一个IdentityReferenceCollection对象。
那我该如何将这些SecurityIdentifier对象转换成适当的名称呢?
3个回答

8

将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

好的替代方案。感谢您的发布。 - user189198

7
解决方案是使用Translate()方法SecurityIdentifier。该方法的单个参数是对您想要将SecurityIdentifier转换为的.NET类型的引用。如果您查看这个答案,就会发现可以简单地传递一个对System.Security.Principal.NTAccount类的引用。
生成的代码可能如下所示:
$Identity = [System.Security.Principal.WindowsIdentity]::GetCurrent();
foreach ($Group in $Identity.Groups) {
    $Group.Translate([System.Security.Principal.NTAccount]).Value;
}

3

看起来你已经有答案了 - 我之前写了一个包装器,还会搜索一些众所周知的安全标识符(SID)列表,如果有帮助的话。 ConvertFrom-SID

一个通用的方法是按以下方式提取,其中$sid保存了一个SID字符串:

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

干杯!


只是在SO上做文档记录 :) - user189198
链接可以作为补充信息很有帮助,但仅包含链接的答案是被强烈反对的出于这些原因。你应该在你的回答中包含代码(添加链接也可以),否则这更像是一条评论而不是一个答案。以目前的形式,你的帖子很可能会被自动标记为低质量帖子并被删除。 - Adi Inbar
@CookieMonster:只是想提醒一下,即使您的 New-Object 语法在技术上可以工作,但它很容易让人误解为 C# 代码,而 PowerShell 明显不是。我进行了编辑,以更清晰地使用 PowerShell 语法来表述。 - user189198

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接