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
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.
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ụ đó.
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
-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
@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
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.
Cảm ơn! 15chars – Pwninstein
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();
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 –
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;
}
Nên cung cấp một số ngữ cảnh cho mã của bạn. – Milo
- 1. Làm cách nào để phát hiện hoạt động của người dùng bằng dịch vụ Java đang chạy trên Windows?
- 2. Làm cách nào để tham khảo dịch vụ đang chạy?
- 3. Làm cách nào để xác minh xem Dịch vụ Windows có đang chạy
- 4. Cài đặt dịch vụ windows trên máy từ xa bằng tên người dùng đã cho
- 5. Cách ngừng dịch vụ đang chạy?
- 6. Dịch vụ WiXCài đặt - cài đặt dịch vụ để chạy khi người dùng cửa sổ hiện tại
- 7. Nhắc mật khẩu tên người dùng trong khi cài đặt dịch vụ windows trong C#
- 8. Gửi Email trong dịch vụ (mà không nhắc người dùng)
- 9. Làm cách nào để tìm hiểu, người dùng nào đang chạy tập lệnh php hiện tại?
- 10. Cách chạy tác vụ khi dịch vụ windows khởi động?
- 11. Cách tốt nhất cho dịch vụ .Net Windows để báo cáo lỗi cho người dùng
- 12. Người dùng thường sử dụng dịch vụ lưu trữ nào để xuất bản trang web Django?
- 13. Làm cách nào để Windows nhận thức được dịch vụ mà tôi đã viết bằng Python?
- 14. Làm cách nào để GUI chờ dịch vụ windows?
- 15. Dịch vụ Windows chạy liên tục
- 16. Dịch vụ xác thực người dùng RESTful
- 17. Cách gọi phương thức chạy dịch vụ windows
- 18. Trong C# làm thế nào để tôi truy vấn danh sách các dịch vụ đang chạy trên một máy chủ Windows?
- 19. Làm thế nào để chạy một exe từ dịch vụ windows và ngừng dịch vụ khi quá trình exe thoát?
- 20. Chạy một quy trình Java trong Windows ngay cả sau khi người dùng đăng xuất
- 21. Dự án thiết lập Dịch vụ Windows - chạy dịch vụ với tư cách quản trị viên
- 22. Nhận tên người dùng Windows từ phía máy chủ WCF
- 23. Kiểm tra xem không có người dùng nào hiện đang đăng nhập vào Windows
- 24. Tôi làm cách nào để có danh sách người dùng với Dịch vụ cốt lõi?
- 25. Làm cách nào để biết người dùng Jenkins đang chạy là gì?
- 26. Người dùng nào đang chạy ứng dụng Rails của tôi?
- 27. Làm cách nào để chạy ứng dụng Windows GUI trên dịch vụ?
- 28. Lấy tên và họ của người dùng Windows hiện tại?
- 29. Log4Net với WCF đang chạy dưới dạng dịch vụ
- 30. Cách ánh xạ HKEY_USERS subkeys và tên người dùng Windows?
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