2

我们有一个从命令行安装 SQL Server Express 并通过参数 SQLACCOUNT="NT AUTHORITY\SYSTEM" 将服务帐户指定为 LocalSystem 帐户的应用程序。

这不适用于不同的语言,因为 LocalSystem 的帐户名称不同。有一个表格列出了这里的差异:

http://forums.microsoft.com/MSR/ShowPost.aspx?PostID=685354&SiteID=37

这似乎并不完整(未列出瑞典语版本)。所以我希望能够以编程方式确定名称,也许使用 SID?

我找到了一些 VB 脚本来执行此操作:

Set objWMI = GetObject("winmgmts:root\cimv2") 

Set objSid = objWMI.Get("Win32_SID.SID='S-1-5-18'") 

MsgBox objSid.ReferencedDomainName & "\" & objSid.AccountName 

有谁知道可以在 C# 中使用的等效代码?

4

4 回答 4

9

为此,您可以使用 .NET 的内置System.Security.Principal.SecurityIdentifier类:通过将其转换为NtAccount的实例,您可以获得帐户名称:

using System.Security.Principal;


SecurityIdentifier sid = new SecurityIdentifier("S-1-5-18");
NTAccount acct = (NTAccount)sid.Translate(typeof(NTAccount));
Console.WriteLine(acct.Value);

稍后编辑,以回应评论中的问题:您不需要任何特殊权限即可在本地计算机上进行 SID-to-name 查找 - 例如,即使您运行的用户帐户仅在 Guest 组中,这段代码应该可以工作。如果 SID 解析为域帐户,情况会有所不同,但即使在大多数情况下,只要您登录到域(并且在查找时域控制器可用),它也应该可以正常工作.

于 2008-10-15T14:49:27.203 回答
3

或者您可以使用:

string localSystem = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null).Translate(typeof(NTAccount)).Value;

例如,WellKnownSidType您可以查找其他帐户。NetworkService

于 2013-04-10T12:59:46.293 回答
1

这应该与您发布的内容类似。我不确定如何立即获取 WMI 对象的特定属性,但这将使您开始使用以下语法:

ManagementObject m = new ManagementObject("winmgmts:root\cimv2");
m.Get();
MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());
于 2008-10-15T14:34:37.840 回答
1

接受答案的问题是帐户名必须可由运行代码的本地机器解析。

如果您在远程机器上读取 ACL,您可能无法解析远程机器上的域 SID/本地 SID。以下使用 WMI 并获取远程机器的参数和您希望远程机器解析的 SID。

/// <summary>
/// Returns the Account name for the specified SID 
// using WMI against the specified remote machine
/// </summary>
private string RemoteSID2AccountName(String MachineName, String SIDString)
{
    ManagementScope oScope = new ManagementScope(@"\\" + MachineName +     
       @"\root\cimv2");
    ManagementPath oPath = new ManagementPath("Win32_SID.SID='" + SIDString + "'");
    ManagementObject oObject = new ManagementObject(oScope, oPath, null);
    return oObject["AccountName"].ToString();
}
于 2009-07-21T14:29:58.797 回答