0

我有下面的 Windows 控制台程序代码,它应该显示NT Authoroty\Network Service但令人惊讶的是它拼写NetworkService没有空格......当我检查 SQLAgent 正在运行的帐户时,它确实是Network Service

为什么这段代码会删除空格?由于NetworkService不存在,它会破坏我的所有解决方案。

PS:我不想硬编码用户;我必须自动得到它。

class Program
{
    static string GetSQLAgentUsername()
    {
        string servicePath = string.Format("Win32_Service.Name='{0}'", "SQLSERVERAGENT");
        using (ManagementObject theService = new ManagementObject(new ManagementPath(servicePath)))
        {
            return theService.Properties["StartName"].Value.ToString();
        }
    }

    static void Main(string[] args)
    {
        System.Console.WriteLine(GetSQLAgentUsername());
        System.Console.ReadKey();
    }


}
4

1 回答 1

2

根据这个 MSDN page,这是因为:

虽然安全子系统会本地化此帐户名称,但 SCM 不支持本地化名称。因此,您将从 LookupAccountSid 函数收到此帐户的本地化名称,但是当您调用 CreateService 或 ChangeServiceConfig 时,该帐户的名称必须是 NT AUTHORITY\NetworkService,无论区域设置如何,否则可能会出现意外结果。

从 WMO 检索名称时获得的值,您将获得逐字传递给 CreateService (AUTHORITY\NetworkService) 的值。

如果有另一个 API 需要“AUTHORITY\NETWORK SERVICE”,我会感到惊讶,你能举个例子吗?

于 2012-05-22T18:27:56.590 回答