【问题标题】:Determine the LocalSystem account name using C#使用 C# 确定 LocalSystem 帐户名称
【发布时间】:2010-09-17 07:46:52
【问题描述】:

我们有一个应用程序,它从命令行安装 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# 中使用的等效代码吗?

【问题讨论】:

    标签: c# sql-server localsystem


    【解决方案1】:

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

    ManagementObject m = new ManagementObject("winmgmts:root\cimv2");
    m.Get();
    MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());
    

    【讨论】:

    • 还要感谢丹尼。我总是很感激你的回应。
    【解决方案2】:

    您可以为此目的使用 .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);
    

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

    【讨论】:

    • 感谢 mdb。在受限权限帐户下运行此代码会不会有任何问题?
    • 再次感谢 mdb。刚刚测试了在降低权限帐户和各种操作系统语言下运行的示例应用程序中的代码。工作一种享受!
    • 使用the SecurityIdentifier constructor that takes a WellKnownSidType value as a parameter 是比传递神秘的 SDDL 字符串更好的选择。 Vinicius Ottoni 在下面提供了这个解决方案。
    【解决方案3】:

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

    如果您在远程机器上读取 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();
    }
    

    【讨论】:

      【解决方案4】:

      或者你可以使用:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 2021-01-31
        相关资源
        最近更新 更多