2016-08-19 17 views
1

我想弄清楚如何確定程序是否正在運行管理模式。我已經展示了一些例如編碼是什麼,我在.NET中使用如下:NET - 試圖找出用戶是否正在運行ADMIN的問題

Imports System.Security.Principal 

Module Module1 

    Sub Main() 

     Dim id = WindowsIdentity.GetCurrent() 
     Dim pr = New WindowsPrincipal(id) 
     Dim isAdm As Boolean = pr.IsInRole(WindowsBuiltInRole.Administrator) 

     If isAdm = True Then 
      MessageBox.Show(Me, "Running Admin") 
     else 
      MessageBox.Show(Me, "Not Running Admin")  
     End If 

    End Sub 

End Module 

這個偉大的工程在大多數情況下,但我有誰運行的是Windows 7專業版用戶和它返回TRUE不管是什麼,如果他以管理員身份運行或不運行。

我不知道是什麼會導致這種情況,但有沒有辦法找出爲什麼會發生這種情況,並可能是一種解決方案。無論是通過編碼,還是解決這個問題的編碼,要麼發現程序總是返回true。

任何線索?

+0

您的代碼正在檢查當前**用戶** _是否爲admin,而不是當前**進程** _是否以管理員權限運行。要檢查進程是否以提升(管理員)權限運行,您很可能必須處理令牌。 [**這個答案可能會有幫助**](http://stackoverflow.com/a/4497572/3740093)。 –

+0

感謝您的回覆。我也嘗試過,也沒有工作。它也返回真實,這真的很奇怪。總體問題是,如果用戶首次以管理員身份運行該程序,則這些文件也會以管理員權限編寫。然後,如果您以用戶的身份啓動該程序,則無法寫入文件,因爲存在拒絕訪問權限。我在想如何防止這種情況,或者至少警告用戶。 – Valleriani

+1

您可以將文件權限設置爲'everyone'代替。 http://stackoverflow.com/questions/9108399/how-to-grant-full-permission-to-a-file-created-by-my-application-for-all-users – FloatingKiwi

回答

1

我不知道.NET的方式;但我可以給你的本機代碼,然後你就可以P/Invoke調用到:

/* 
    This function returns true if you are currently running with admin privileges. 
    In Vista and later, if you are non-elevated, this function will 
    return false (you are not running with administrative privileges). 
    If you *are* running elevated, then IsUserAdmin will return true, 
    as you are running with admin privileges. 

    Windows provides this similar function in Shell32.IsUserAnAdmin. 
    But that function is depricated. 
    This code is adapted from from the docs for CheckTokenMembership: 
    http://msdn.microsoft.com/en-us/library/aa376389.aspx 

    Note: 
     - you can be an administrator and not have admin privileges 
     (function returns false) 
     - you can have admin privileges even though you're not an administrator 
     (function returns true) 

    Any code released into the public domain. No attribution required. 
*/ 

Boolean IsUserAdmin() 
{ 
    Boolean isAdmin; 

    PSID administratorsGroup = StringToSid("S-1-5-32-544"); //well-known sid 

    if (!CheckTokenMembership(0, administratorsGroup, out isAdmin) 
     isAdmin = false; 

    FreeSid(administratorsGroup); 

    return isAdmin; 
} 

注意:使用CheckTokenMembership對管理員組比其他代碼漂浮在那裏非常不同。其他代碼:

  • 使用OpenProcessToken得到「我」令牌
  • 使用GetTokenInformationTokenGroups得到TOKEN_GROUPS,其中列出了所有組的用戶是
  • 迭代返回的羣組,使用EqualSid他們與Adminstrators SID比較

這是錯誤的,因爲:

您可以成爲管理員組的成員,但不具有管理員權限!

此代碼可用於瞭解您是否可以提升;而IsUserAdmin告訴你,如果你提升。

同樣,您可以擁有管理員權限,但不能成爲管理員組的成員。使用IsUserAdmin()查看您目前是否有實際上有管理權限。

相關問題