2014-06-11 75 views
0

我使用WMI來獲取正在運行的所需進程的用戶名。它可以在Windows XP中正常運行,並返回所有運行進程的用戶(例如:notepad.exe)獲取進程的所有用戶

但是在Windows 8中它只返回當前用戶,其他運行該進程的用戶不會出現。當我檢查時,我發現returnVal是2(拒絕訪問),而不是0.但我在管理用戶中運行它。以管理員身份正常運行。那麼有沒有解決方案?或者請爲我提供一個可以讓所有用戶參與的過程。

Public Function GetProcessOwner(ByVal processName As String) As String 
     Dim query As String = (Convert.ToString("Select * from Win32_Process Where Name = """) & processName) + """" 
     Dim searcher As New ManagementObjectSearcher(query) 
     Dim owner As String 
     Dim processList As ManagementObjectCollection = searcher.[Get]() 

     For Each obj As ManagementObject In processList 
      Dim argList As String() = New String() {String.Empty, String.Empty} 
      Dim returnVal As Integer = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList)) 
      If returnVal = 0 Then 


       owner = owner & " " & argList(0) 

      End If 
     Next 

     Return Owner 
    End Function 
+0

您是否在升高的過程中運行它? –

+0

這看起來不像C#:) – derape

+0

@derape它的一小段代碼。 C#代碼解決方案也受到歡迎。 –

回答

1

從Windows Vista開始,由於採用了新的安全模型,現在需要提升權限才能訪問當前用戶未運行的進程屬性。許多其他事情也是如此,例如寫入Program Files,訪問HKLM等。

所以基本上你需要開始你的升級過程。請參閱:Run elevated process

+0

好的。有沒有相同的Win32 API?他們還需要提升特權? –

+1

@ITresearcher是的,你的進程調用的任何Win32函數都會有相同的要求(提升的權限)。 – ken2k