Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Service 如何查询WMI以了解启动服务的用户的名称?_Service_Wmi - Fatal编程技术网

Service 如何查询WMI以了解启动服务的用户的名称?

Service 如何查询WMI以了解启动服务的用户的名称?,service,wmi,Service,Wmi,我在wbemtest中使用了几个WMI查询,试图找出哪个用户启动了特定的服务。让我走到这一步的就是这里。 我知道如果我查询win32_服务对象,如: select * from win32_service where name like '%SERVICENAME%' 我只得到了一个我正在寻找的服务的结果,然后我双击它浏览服务属性,发现有一个名为StartName的属性,它显示启动它的用户的名称,这就是我想要的 现在,当我这样做时,问题就开始了: select StartName from

我在wbemtest中使用了几个WMI查询,试图找出哪个用户启动了特定的服务。让我走到这一步的就是这里。 我知道如果我查询win32_服务对象,如:

select * from win32_service where name like '%SERVICENAME%'
我只得到了一个我正在寻找的服务的结果,然后我双击它浏览服务属性,发现有一个名为StartName的属性,它显示启动它的用户的名称,这就是我想要的

现在,当我这样做时,问题就开始了:

 select StartName from win32_service where name like '%SERVICENAME%'
我得到Win32_服务=:

即使没有where子句,它也显示相同的内容


我缺少什么来让它工作呢?

这是一个展示的东西。您的查询有效,如果双击结果,您将看到服务的StartName:

我猜这是因为您没有选择键属性名称。如果将名称添加到查询中,将在结果中看到Win32_Service.Name=Name

顺便说一句,在代码中,无论是否查询键属性,您都将获得所选属性和键属性:

'VBScript示例 strComputer=。 设置objWMIService=GetObjectwinmgmts:\\&strComputer&\root\CIMV2 设置colItems=objWMIService.ExecQuery_ 从Win32_服务中选择StartName,其中的名称类似于“%winmgmt%”,48 对于每个对象,在colitem中
Echo Name:&objItem.Name'我为C编写了一个实际工作的代码

    public Service GetServiceDetails(string serviceName)
    {
      using (var managementBaseObject = new ManagementObjectSearcher(new SelectQuery(string.Format("SELECT * FROM Win32_Service WHERE Name = '{0}'", serviceName))).Get())
      {
        ManagementObject mo = managementBaseObject.Cast<ManagementObject>().FirstOrDefault();

        if (mo == null) return null;

        var service = new Service
        {
          AcceptPause = mo["AcceptPause"] != null && (bool) mo["AcceptPause"],
          AcceptStop = mo["AcceptStop"] != null && (bool)mo["AcceptStop"],
          Caption =  mo["Caption"] != null ? mo["Caption"].ToString() : string.Empty,
          Description =  mo["Description"] != null ? mo["Description"].ToString() : string.Empty,
          DisplayName = mo["DisplayName"] != null ? mo["DisplayName"].ToString() : string.Empty,
          Name = mo["Name"] != null ? mo["Name"].ToString() : string.Empty,
          PathName = mo["PathName"] != null ? mo["PathName"].ToString() : string.Empty,
          ProcessId = mo["ProcessId"] != null ? Convert.ToInt32(mo["ProcessId"]) : 0,
          ServiceType = mo["ServiceType"] != null ? mo["ServiceType"].ToString() : string.Empty,
          Started = mo["Started"] != null && (bool)mo["Started"],
          StartMode = mo["StartMode"] != null ? mo["StartMode"].ToString() : string.Empty,
          StartName = mo["StartName"] != null ? mo["StartName"].ToString() : string.Empty,
          State = mo["State"] != null ? mo["State"].ToString() : string.Empty,
          Status = mo["Status"] != null ? mo["Status"].ToString() : string.Empty,
        };
        return service;
      }
    }

对我来说效果很好:从win32_服务中选择StartName,其中类似“%winmgmt%”的名称返回StartName=localSystem的服务。你在用什么操作系统?你能发布一个完整的代码示例来说明你看到的行为吗?谢谢Helen,我正在Windows 8.1x64上使用wbemtest.exe,尽管我不确定它的行为是否会如此不同。我今天也会在我的Hyper-V Windows7x64虚拟机上尝试一下,看看它是否在那里工作。运气不好,结果也一样