使用C#确定LocalSystem帐户名称
我们有一个应用程序从命令行安装SQL Server Express,并通过参数SQLACCOUNT =“NT AUTHORITY SYSTEM”将服务帐户指定为LocalSystem帐户。
这不适用于不同的语言,因为LocalSystem的帐户名称不同。 这里有一个列出差异的表格:
https://forums.microsoft.com/MSR/ShowPost.aspx?PostID=685354&SiteID=37
这似乎并不完整(未列出瑞典语版本)。 所以我希望能够以编程方式确定名称,也许使用SID?
我找到了一些VB脚本来做到这一点:
Set objWMI = GetObject("winmgmts:rootcimv2") Set objSid = objWMI.Get("Win32_SID.SID='S-1-5-18'") MsgBox objSid.ReferencedDomainName & "" & objSid.AccountName
有谁知道可以在C#中使用的等效代码?
您可以使用.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解析为域帐户,情况会有所不同,但即使这样在大多数情况下也能正常工作,只要您登录到域(并且在查找时域控制器可用) 。
或者您可以使用:
string localSystem = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null).Translate(typeof(NTAccount)).Value;
使用WellKnownSidType
您可以查找其他帐户,例如NetworkService
。
这应该与您发布的内容类似。 我不确定如何随意获取WMI对象的特定属性,但这将使您开始使用语法:
ManagementObject m = new ManagementObject("winmgmts:rootcimv2"); m.Get(); MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());
接受的答案的问题是,帐户名必须由运行代码的本地计算机解析。
如果您正在读取远程计算机上的ACL,则可能无法解析远程计算机上的域SID /本地SID。 以下使用WMI并获取远程计算机的参数和您希望远程计算机解析的SID。
上述就是C#学习教程:使用C#确定LocalSystem帐户名称分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
/// /// Returns the Account name for the specified SID // using WMI against the specified remote machine /// private string RemoteSID2AccountName(String MachineName, String SIDString) { ManagementScope oScope = new ManagementScope(@"\" + MachineName + @"rootcimv2"); ManagementPath oPath = new ManagementPath("Win32_SID.SID='" + SIDString + "'"); ManagementObject oObject = new ManagementObject(oScope, oPath, null); return oObject["AccountName"].ToString(); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013342.html