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