Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取SQLAgent用户名失败_C#_.net_Visual Studio_Wmi_Clr4.0 - Fatal编程技术网

C# 获取SQLAgent用户名失败

C# 获取SQLAgent用户名失败,c#,.net,visual-studio,wmi,clr4.0,C#,.net,Visual Studio,Wmi,Clr4.0,我有下面的windows控制台程序代码,它应该显示为NT Authoroty\Network Service,但令人惊讶的是,它拼写为NetworkService,没有空格。。。当我检查SQLAgent运行的帐户时,它确实是网络服务 为什么此代码会删除空格?由于NetworkService不存在,因此它会分解我的所有解决方案 PS:我不想硬编码用户;我必须自动得到它 class Program { static string GetSQLAgentUsername() {

我有下面的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();
    }


}
据认为,这是因为:

当安全子系统将此帐户名本地化时,SCM将执行此操作 不支持本地化名称。因此,您将收到一份本地化的 LookupAccountSid函数中此帐户的名称,但名称 调用时,帐户的名称必须是NT AUTHORITY\NetworkService CreateService或ChangeServiceConfig,不考虑语言环境,或 可能会出现意外的结果

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


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

这段代码还返回“NT AUTHORITY\networkservice”
SecurityIdentifier ident=new SecurityIdentifier(WellKnownSidType.NetworkServiceSid,null);字符串名称=标识转换(typeof(NTAccount)).Value我遇到这个问题主要是因为TFSAPI使用本地化名称。如果我查询特定用户的工作区(在本例中为构建服务器的服务帐户),我需要将从WMI接收的帐户转换为TFS API所需的帐户。看起来您可能需要求助于pinvoking。可能是调用LsaLookupNames()获取sid,然后调用LsaLookupSids2()获取名称?我现在不在windows机器上,但如果您对pinvoke代码不满意,我可以稍后再试一次。