sql server-使用C#确定LocalSystem帐户名
本文关键字:LocalSystem 确定 server- 使用 sql | 更新日期: 2023-09-27 17:47:46
我们有一个应用程序,它从命令行安装SQL Server Express,并通过参数SQLACCOUNT="NT AUTHORITY''SYSTEM"将服务帐户指定为LocalSystem帐户。
这不适用于不同的语言,因为LocalSystem的帐户名不同。这里有一张表列出了差异:
http://forums.microsoft.com/MSR/ShowPost.aspx?PostID=685354&站点ID=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#中可以使用的等效代码吗?
您可以使用。NET的内置系统。安全最重要的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:root'cimv2");
m.Get();
MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());
接受的答案的问题是,帐户名称必须由运行代码的本地机器解析。
如果您正在远程机器上读取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();
}