給定服務名稱,我想檢索它運行的用戶名(即服務屬性窗口的「登錄」選項卡中顯示的用戶名)。在ServiceController
類中似乎沒有任何東西來檢索這些基本信息。 System.ServiceProcess
中沒有其他東西看起來像它公開這些信息。有沒有一個管理的解決方案,或者我將不得不下降到更低層次?如何檢索Windows服務正在運行的用戶名?
回答
使用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();
}
}
}
您可以日後再使用你的服務名稱來替代註釋代碼,它應該只返回你的服務過程的情況下,正在運行。
試試這個:
System.Security.Principal.WindowsIdentity.GetCurrent();
但最明顯的你將得到本地系統或網絡。您無法顯示此用戶的原因 - 該服務可以管理多個用戶(由桌面共享,連接到當前的Windows會話,使用共享資源...) 系統啓動服務,但任何用戶都可以使用它。
然後你可以從上面的命令返回WindowsIdentity對象的名稱屬性。 – ewall 2010-06-29 14:26:15
-1這將返回當前用戶的'WindowsIdentity',而不是指定的服務。 – Pwninstein 2010-06-29 14:31:50
@Pwninstein照常服務從SYSTEM或NETWORK憑證啓動 - 而不是從「登錄」用戶啓動。查看我對此的編輯。因此,澄清你想獲得啓動服務的系統帳戶(我的回答對此是正確的)還是當前登錄的用戶列表,可以使用此服務? – Dewfy 2010-06-29 14:37:05
WMI是你的朋友。看看Win32_Service,特別是StartName
屬性。您可以通過System.Management.ManagementClass從C#訪問WMI。
如果您之前沒有使用過WMI,this的文章似乎是一個相當不錯的教程。
謝謝! 15chars – Pwninstein 2010-07-01 02:56:41
該解決方案爲我工作得很好:
ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'");
wmiService.Get();
string user = wmiService["startname"].ToString();
添加一些解釋和答案,這個答案如何幫助OP在修復當前問題 – 2016-01-14 10:46:36
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;
}
應該給你的代碼一些上下文。 – Milo 2017-12-05 12:50:40
- 1. 從Windows服務中檢索用戶帳戶名
- 2. 在WCF中,如何訪問服務正在運行的用戶?
- 3. 在Windows服務器域中檢索用戶的姓名,其登錄名爲
- 4. 檢索在svchost後面運行的服務的名稱
- 5. 如果Windows進程在服務停止時正在運行,如何檢查Python?
- 6. 使用用戶名和密碼運行Windows服務
- 7. .NET Windows服務用戶名
- 8. 如何在運行時獲取Windows服務的名稱?
- 9. 如何使用Windows服務運行EXE
- 10. 檢索運行WCF服務的AppPool的Windows標識
- 11. 如何清除正在運行的Windows服務的System.Runtime.Caching.MemoryCache而不停止服務?
- 12. 檢查一個Windows服務是否正在運行?
- 13. 檢查服務正在運行procrun
- 14. 檢查服務正在運行VBNET
- 15. 檢查服務是否正在運行?
- 16. 檢查服務是否正在運行
- 17. 檢索在服務器上運行的服務列表vb.net
- 18. 如何使用Windows服務上運行的WCF服務
- 19. 如何獲取Windows Azure移動服務用戶的用戶名?
- 20. 如何知道哪臺機器正在運行windows服務
- 21. 如何驗證Windows服務是否正在運行
- 22. 如何在Linux上檢查服務是否正在運行Mint
- 23. 如何在安裝前檢查服務是否正在運行?
- 24. Python:檢查命名服務正在運行
- 25. 在網絡帳戶下運行的Windows服務正在調用EXE並在系統帳戶下運行它?
- 26. WCF服務託管在Windows服務將無法正常運行
- 27. 獲取正在運行的服務(LINUX JAVA):如何僅解析服務名稱?
- 28. Windows服務無法正常運行c#
- 29. 運行windows服務觀看服務正在運行增長內存(泄漏)
- 30. C程序 - 如何檢查Web服務是否正在運行
還沒有嘗試過,但這看起來像贏家!謝謝! – Pwninstein 2010-07-01 02:57:09