Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# C使用ServiceController类获取服务登录?_C# - Fatal编程技术网

C# C使用ServiceController类获取服务登录?

C# C使用ServiceController类获取服务登录?,c#,C#,是否可以使用ServiceController类获取登录帐户?我使用以下代码获取远程机器上的服务显示名称和服务状态。我没有看到一个属性指示服务运行在哪个帐户下。如果没有,那么我是否可以使用另一个类来查找服务运行的帐户 ServiceController[] services = ServiceController.GetServices("MyRemotePC"); foreach (ServiceController service in services) {

是否可以使用ServiceController类获取登录帐户?我使用以下代码获取远程机器上的服务显示名称和服务状态。我没有看到一个属性指示服务运行在哪个帐户下。如果没有,那么我是否可以使用另一个类来查找服务运行的帐户

ServiceController[] services = ServiceController.GetServices("MyRemotePC");

foreach (ServiceController service in services)
{                                     
    Console.WriteLine(
        "The {0} service is currently {1}.",
        service.DisplayName,
        service. Status
        );
}                

对于每个服务,下面首先检查服务是否正在运行。 如果是,它将获取服务的processId并使用ManagementObjectSearch检索相应的流程对象。从那里,它调用GetOwnerout string user,从底层Win32_进程对象中输出字符串域,如果调用成功,则输出结果

下面的代码在本地工作,但是我没有权限对远程计算机进行测试。即使在本地,我也必须以管理员的身份运行应用程序。GetOwner不返回2访问被拒绝的错误结果

var services = ServiceController.GetServices("MyRemotePC");
var getOptions = new ObjectGetOptions(null, TimeSpan.MaxValue, true);
var scope = new ManagementScope(@"\\MyRemotePC\root\cimv2");

foreach (ServiceController service in services)
{
    Console.WriteLine($"The {service.DisplayName} service is currently {service.Status}.");

    if (service.Status != ServiceControllerStatus.Stopped)
    {
        var svcObj = new ManagementObject(scope, new ManagementPath($"Win32_Service.Name='{service.ServiceName}'"), getOptions);
        var processId = (uint)svcObj["ProcessID"];
        var searcher = new ManagementObjectSearcher(scope, new SelectQuery($"SELECT * FROM Win32_Process WHERE ProcessID = '{processId}'"));
        var processObj = searcher.Get().Cast<ManagementObject>().First();
        var props = processObj.Properties.Cast<PropertyData>().ToDictionary(x => x.Name, x => x.Value);
        string[] outArgs = new string[] { string.Empty, string.Empty };
        var returnVal = (UInt32)processObj.InvokeMethod("GetOwner", outArgs);
        if (returnVal == 0)
        {
            var userName = outArgs[1] + "\\" + outArgs[0];
            Console.WriteLine(userName);
        }
    }
}

您可以使用WMI获取该信息,请参阅