Учитывая имя службы, я хотел бы получить имя пользователя, с которым оно выполняется (например, имя пользователя, указанное на вкладке "Вход" окна свойств службы). Кажется, что ничего не найдено в классе ServiceController
для получения этой базовой информации. Ничто другое в System.ServiceProcess
не похоже на то, что оно раскрывает эту информацию. Есть ли управляемое решение, или мне придется спуститься на что-то более низкое?
Как получить имя пользователя, на котором работает служба Windows?
Ответ 1
Используя WMI, с помощью System.Management вы можете попробовать следующий код:
using System;
namespace WindowsServiceTest
{
class Program
{
static void Main(string[] args)
{
System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select name, startname from Win32_Service")); // where name = '{0}'", "MCShield.exe"));
using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery))
{
foreach (System.Management.ManagementObject service in mgmtSearcher.Get())
{
string servicelogondetails =
string.Format("Name: {0} , Logon : {1} ", service["Name"].ToString(), service["startname"]).ToString();
Console.WriteLine(servicelogondetails);
}
}
Console.ReadLine();
}
}
}
Затем вы можете заменить код с комментариями своим именем службы, и он должен возвращать только экземпляры вашего процесса обслуживания.
Ответ 2
WMI - ваш друг. Посмотрите Win32_Service, в частности свойство StartName
. Вы можете получить доступ к WMI с С# через System.Management.ManagementClass.
Если вы еще не использовали WMI, эта статья, кажется, неплохой учебник.
Ответ 3
Попробуйте следующее:
System.Security.Principal.WindowsIdentity.GetCurrent();
но наиболее очевидным вы получите ЛОКАЛЬНУЮ СИСТЕМУ или СЕТЬ. Причина, по которой вы не можете показать этого пользователя - эта служба может управлять несколькими пользователями (совместно используемыми на рабочем столе, подключенными к текущему сеансу Windows, с использованием общего ресурса...) Система запускает службу, но любой пользователь может ее использовать.
Ответ 4
Это решение отлично подходит для меня:
ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'");
wmiService.Get();
string user = wmiService["startname"].ToString();
Ответ 5
public String getUsername() {
string username = null;
try {
ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2");
ms.Connect();
ObjectQuery query = new ObjectQuery
("SELECT * FROM Win32_ComputerSystem");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(ms, query);
foreach (ManagementObject mo in searcher.Get()) {
username = mo["UserName"].ToString();
}
string[] usernameParts = username.Split('\\');
username = usernameParts[usernameParts.Length - 1];
} catch (Exception) {
username = "SYSTEM";
}
return username;
}
Ответ 6
Вы можете найти это в реестре Windows, прочитав следующее строковое значение, заменив [SERVICE_NAME]
именем службы Windows:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[SERVICE_NAME]\ObjectName