我们有一个应用程序,它从命令行安装SQL Server Express,并通过参数SQLACCOUNT="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#中使用的等效代码?
发布于 2008-10-15 14:49:27
您可以使用.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到名称的查找--例如,即使您正在运行的用户帐户只在Guests组中,此代码也应该可以工作。如果SID解析为域帐户,情况会略有不同,但即使这样,在大多数情况下也应该正常工作,只要您登录到域(并且在查找时域控制器可用)。
发布于 2013-04-10 20:59:46
或者,您可以使用:
string localSystem = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null).Translate(typeof(NTAccount)).Value;使用WellKnownSidType,您可以查找其他帐户,例如NetworkService。
发布于 2008-10-15 14:34:38
这应该会做一些与你发布的类似的事情。我不确定如何立即获得WMI对象的特定属性,但这将使您从语法开始:
ManagementObject m = new ManagementObject("winmgmts:root\cimv2");
m.Get();
MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());https://stackoverflow.com/questions/204942
复制相似问题