Как получить имя пользователя, под которым работает служба Windows? - PullRequest
15 голосов
/ 29 июня 2010

Учитывая имя службы, я хотел бы получить имя пользователя, под которым она работает (т.е. имя пользователя, отображаемое на вкладке «Вход в систему» ​​окна свойств службы).Кажется, что в классе ServiceController нет ничего, чтобы извлечь эту основную информацию.Ничто другое в System.ServiceProcess не выглядит так, как будто оно также предоставляет эту информацию.Есть ли управляемое решение для этого, или мне придется перейти на что-то более низкое?

Ответы [ 5 ]

22 голосов
/ 29 июня 2010

Используя 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();
        }
    }
}

Затем вы можете позже заменить закомментированный код именем вашей службы, и он должен возвращать только экземпляры вашей службыпроцесс, который выполняется.

6 голосов
/ 29 июня 2010

WMI - твой друг.Посмотрите на Win32_Service , в частности, свойство StartName.Вы можете получить доступ к WMI из C # через System.Management.ManagementClass .

Если вы раньше не использовали WMI, эта статья кажется довольно хорошим руководством.

2 голосов
/ 29 июня 2010

Попробуйте:

System.Security.Principal.WindowsIdentity.GetCurrent();

, но самое очевидное, вы получите ЛОКАЛЬНУЮ СИСТЕМУ или СЕТЬ.Причина, по которой вы не можете показать этого пользователя - эта служба может управлять несколькими пользователями (общими для рабочего стола, подключенными к текущему сеансу Windows, с использованием общего ресурса ...) Система запускает службу, но ее может использовать любой пользователь.

0 голосов
/ 05 декабря 2017
    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;
  }
0 голосов
/ 14 января 2016

Это решение отлично работает для меня:

    ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'");
    wmiService.Get();
    string user = wmiService["startname"].ToString();
...