2010-06-29 30 views
13

Với tên dịch vụ, tôi muốn truy xuất tên người dùng mà nó chạy dưới (tức là tên người dùng được hiển thị trong tab 'Đăng nhập' của cửa sổ thuộc tính của dịch vụ). Có vẻ như không có gì trong lớp ServiceController để truy xuất thông tin cơ bản này. Không có gì khác trong số System.ServiceProcess có vẻ như nó cũng hiển thị thông tin này. Có một giải pháp được quản lý cho điều này không, hay tôi sẽ phải thả xuống một thứ gì đó cấp thấp hơn?Làm cách nào để truy xuất tên người dùng mà dịch vụ Windows đang chạy?

Trả lời

20

Sử dụng WMI, với System.Management bạn có thể thử đoạn mã sau:

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(); 
     } 
    } 
} 

Bạn có thể sau đó thay thế mã nhận xét với tên dịch vụ của bạn, và nó chỉ nên trả lại trường hợp của quá trình dịch vụ của bạn đang chạy.

+0

Chưa thử, nhưng điều này trông giống như một người chiến thắng! Cảm ơn! – Pwninstein

2

Hãy thử điều này:

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

nhưng rõ ràng nhất bạn sẽ nhận được hệ thống mạng hay cục bộ. Lý do bạn không thể hiển thị người dùng này - dịch vụ đó có thể quản lý nhiều người dùng (được chia sẻ bởi máy tính để bàn, được đính kèm với phiên cửa sổ hiện tại, sử dụng tài nguyên được chia sẻ ...) Hệ thống bắt đầu dịch vụ, nhưng bất kỳ người dùng nào cũng có thể sử dụng dịch vụ đó.

+0

Sau đó, bạn có thể nhận được các thuộc tính Name của đối tượng WindowsIdentity trở về từ lệnh trên. – ewall

+3

-1 Điều này trả về 'WindowsIdentity' của người dùng hiện tại, không phải của một dịch vụ được chỉ định. – Pwninstein

+0

@Pwninstein như dịch vụ thông thường được bắt đầu từ thông tin đăng nhập SYSTEM hoặc NETWORK - không phải từ người dùng "đã đăng nhập". Xem các chỉnh sửa của tôi về điều này. Vì vậy, làm rõ bạn muốn có được tài khoản hệ thống bắt đầu dịch vụ (câu trả lời của tôi là chính xác về điều này) hoặc danh sách người dùng đăng nhập hiện tại, có thể sử dụng dịch vụ này? – Dewfy

6

WMI là bạn của bạn. Nhìn vào số Win32_Service, cụ thể là thuộc tính StartName. Bạn có thể truy cập WMI từ C# qua số System.Management.ManagementClass.

Nếu bạn chưa sử dụng WMI trước đây, this bài viết có vẻ là một hướng dẫn khá tốt.

+0

Cảm ơn! 15chars – Pwninstein

0

Giải pháp này hoạt động tốt đối với tôi:

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

Thêm một số giải thích với câu trả lời cho cách câu trả lời này giúp OP trong việc khắc phục sự cố hiện tại –

0
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; 
    } 
+1

Nên cung cấp một số ngữ cảnh cho mã của bạn. – Milo

Các vấn đề liên quan