代码之家  ›  专栏  ›  技术社区  ›  Carl

使用c确定本地系统帐户名#

  •  2
  • Carl  · 技术社区  · 16 年前

    我们有一个应用程序可以从命令行安装SQL Server Express,并通过参数sqlcaccount=“nt authority\system”将服务帐户指定为本地系统帐户。

    这不适用于不同的语言,因为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 回复  |  直到 8 年前
        1
  •  7
  •   mdb    16 年前

    您可以使用.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查找——例如,即使您运行的用户帐户仅在guests组中,此代码也应该有效。如果sid解析为一个域帐户,情况会稍有不同,但即使在大多数情况下,只要您登录到域(并且在查找时有域控制器可用),这也会正常工作。

        2
  •  3
  •   Vinicius Ottoni    11 年前

    或者你可以使用:

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

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

        3
  •  1
  •   TheSmurf    16 年前

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

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

    接受的答案的问题是,运行代码的本地计算机必须能够解决帐户名。

    如果您正在远程计算机上读取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();
    }
    
    推荐文章