【问题标题】:Getting SQLAgent username fails获取 SQLAgent 用户名失败
【发布时间】:2011-10-12 14:34:28
【问题描述】:

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

为什么这段代码会删除空格?由于 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();
    }


}

【问题讨论】:

    标签: c# .net visual-studio wmi clr4.0


    【解决方案1】:

    根据this MSDN page,是因为:

    虽然安全子系统会本地化此帐户名称,但 SCM 会 不支持本地化名称。因此,您将收到一个本地化的 来自 LookupAccountSid 函数的此帐户的名称,但名称 调用时,该帐户的名称必须是 NT AUTHORITY\NetworkService 无论语言环境如何,CreateService 或 ChangeServiceConfig,或 可能会出现意想不到的结果。

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

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

    【讨论】:

    • 此代码还返回“NT AUTHORITY\NETWORK SERVICE”SecurityIdentifier ident = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null); string name = ident.Translate(typeof(NTAccount)).Value;
    • 我遇到这个问题主要是因为 TFS API 使用本地化名称。如果我查询特定用户的工作区(在本例中是我们构建服务器的服务帐户),我需要将从 WMI 收到的帐户转换为 TFS API 预期的帐户。
    • 看起来你可能需要求助于一些 pinvoking。也许调用 LsaLookupNames (msdn.microsoft.com/en-us/library/windows/desktop/…) 来获取 sid,然后调用 LsaLookupSids2 (msdn.microsoft.com/en-us/library/windows/desktop/…) 来获取名称?我现在不在 Windows 盒子上,但如果您对 pinvoke 代码感到不舒服,我可以稍后再试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多