2010-08-30 22 views
58

मेरे एप्लिकेशन को कुछ स्क्रिप्ट चलाने की आवश्यकता है, और मुझे यह सुनिश्चित करना होगा कि उपयोगकर्ता उन्हें चलाने वाला व्यवस्थापक है ... C# का उपयोग करके ऐसा करने का सबसे अच्छा तरीका क्या है?जांचें कि वर्तमान उपयोगकर्ता व्यवस्थापक है

उत्तर

72
using System.Security.Principal; 

public static bool IsAdministrator() 
{ 
    WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 
+4

बस एक नोट है कि उपरोक्त काम नहीं करेगा अगर यूएसी Vista या Win7 में सक्षम है; आपको एक यूएसी पुष्टिकरण बॉक्स पॉप अप करने और उस मामले में अनुमतियों को बढ़ाने की आवश्यकता होगी। – MisterZimbu

+0

http://ayende.com/blog/158401/are-you-an-administrator या http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you के बारे में क्या है -are-an-admin.aspx? कौन सा बेहतर तरीका है? – Kiquenet

+2

मुझे झूठी एफवाई होने के लिए काम नहीं कर रहा है। मैं व्यवस्थापक हूं –

25
return new WindowsPrincipal(WindowsIdentity.GetCurrent()) 
    .IsInRole(WindowsBuiltInRole.Administrator); 
+2

@ निसिम: या तो चरम खराब हो सकता है, लेकिन हमें केस-दर-मामले के आधार पर निर्णय लेने की आवश्यकता है। –

+32

@ निसान: आप दोनों ने एक साथ जवाब दिया, या पर्याप्त तथ्य के बाद कि 5 मिनट पहले आप "5 मिनट पहले" पोस्ट किए गए हैं। एलेक्स पर हमला करने का कोई कारण नहीं है; हम प्रतिनिधि कमाने के लिए यहां नहीं हैं, हम यहां मदद करने के लिए हैं। – Randolpho

+0

http://ayende.com/blog/158401/are-you-an-administrator या http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you के बारे में क्या है -are-an-admin.aspx? कौन सा बेहतर तरीका है? – Kiquenet

2

बस मैं एक और समाधान जोड़ा जाने लगा कि; क्योंकि IsInRole हमेशा काम नहीं करता है।

  • यदि उपयोगकर्ता वर्तमान सत्र में निर्दिष्ट Windows उपयोगकर्ता समूह का सदस्य नहीं है।
  • व्यवस्थापक ने समूह नीति सेटिंग्स
  • में परिवर्तन किए हैं भूमिका पैरामीटर को 'केस संवेदनशील' विधि के रूप में माना जाता है।
  • और यदि किसी एक्सपी मशीन में .NET Framework संस्करण स्थापित नहीं है तो यह काम नहीं करेगा।

यदि आपको पुराने सिस्टम का समर्थन करने की आवश्यकता है तो आपकी आवश्यकताओं के आधार पर; या इस बात से अनिश्चित हैं कि आपका ग्राहक शारीरिक रूप से आपके सिस्टम का प्रबंधन कैसे कर रहा है। यह एक समाधान है जिसे मैंने कार्यान्वित किया; लचीलापन और परिवर्तन के लिए।

class Elevated_Rights 
    { 

     // Token Bool: 
     private bool _level = false; 

     #region Constructor: 

     protected Elevated_Rights() 
     { 

      // Invoke Method On Creation: 
      Elevate(); 

     } 

     #endregion 

     public void Elevate() 
     { 

      // Get Identity: 
      WindowsIdentity user = WindowsIdentity.GetCurrent(); 

      // Set Principal 
      WindowsPrincipal role = new WindowsPrincipal(user); 

      #region Test Operating System for UAC: 

      if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6) 
      { 

       // False: 
       _level = false; 

       // Todo: Exception/ Exception Log 

      } 

      #endregion 

      else 
      { 

       #region Test Identity Not Null: 

       if (user == null) 
       { 

        // False: 
        _level = false; 

        // Todo: "Exception Log/Exception" 

       } 

       #endregion 

       else 
       { 

        #region Ensure Security Role: 

        if (!(role.IsInRole(WindowsBuiltInRole.Administrator))) 
        { 

         // False: 
         _level = false; 

         // Todo: "Exception Log/Exception" 

        } 

        else 
        { 

         // True: 
         _level = true; 

        } 

        #endregion 


       } // Nested Else 'Close' 

      } // Initial Else 'Close' 

     } // End of Class. 

तो उपर्युक्त कोड में कुछ संरचनाएं हैं; यह वास्तव में यह देखने के लिए परीक्षण करेगा कि उपयोगकर्ता Vista या उच्चतर पर है या नहीं। इस तरह यदि कोई ग्राहक साल पहले से ढांचे या बीटा ढांचे के बिना एक्सपी पर है तो यह आपको उस चीज़ को बदलने की अनुमति देगा जो आप करना चाहते हैं।

फिर यह खाते के लिए शून्य मूल्य से बचने के लिए शारीरिक रूप से परीक्षण करेगा।

फिर आखिरकार यह जांचने के लिए चेक प्रदान करेगा कि उपयोगकर्ता वास्तव में उचित भूमिका में है।

मुझे पता है कि प्रश्न का उत्तर दिया गया है; लेकिन मैंने सोचा कि मेरा समाधान किसी और के लिए पृष्ठ के लिए एक बड़ा जोड़ा होगा जो स्टैक खोज रहा है। संरक्षित कन्स्ट्रक्टर के पीछे मेरा तर्क आपको इस वर्ग का उपयोग एक व्युत्पन्न वर्ग के रूप में करने की अनुमति देगा जिससे आप कक्षा को तत्काल नियंत्रित करने की स्थिति को नियंत्रित कर सकें।

+0

के साथ कहना आसान है http://ayende.com/blog/158401/are-you-an-administrator या http://blogs.msdn.com/b/jaredpar/archive/2007 के बारे में क्या है /08/01/detecting-if-you-are-an-admin.aspx? कौन सा बेहतर तरीका है? – Kiquenet

5

आप Windows एपीआई में कॉल कर सकते हैं यह करने के लिए:

[DllImport("shell32.dll", SetLastError=true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsUserAnAdmin(); 

जो और अधिक सामान्य रूप से आपको बताता है कि उपयोगकर्ता ऊंचा अधिकार के तहत चल रहा है या नहीं।

0

मुझे यकीन है कि उपयोगकर्ता उन्हें चलने के लिए किसी व्यवस्थापक

आपके आवेदन व्यवस्थापक अधिकार के साथ चलने किया जाना चाहिए है होना चाहिए, यह अपने प्रकट अद्यतन करने का अधिकार होगा।
requestedExecutionlevel से requireAdminstrator पर सेट करें।

1

IsInRole साथ ऊपर जवाब वास्तव में सही कर रहे हैं: यदि वर्तमान उपयोगकर्ता व्यवस्थापक विशेषाधिकार है यह जाँच करता है। हालांकि,

विंडोज विस्टा से शुरू, उपयोगकर्ता खाता नियंत्रण (यूएसी) उपयोगकर्ता के विशेषाधिकार निर्धारित करता है।यदि आप बिल्ट-इन एडमिनिस्ट्रेटर समूह के सदस्य हैं, तो आपको दो रन-टाइम एक्सेस टोकन असाइन किए जाते हैं: मानक उपयोगकर्ता पहुंच टोकन और व्यवस्थापक पहुंच टोकन। डिफ़ॉल्ट रूप से, आप मानक उपयोगकर्ता भूमिका में हैं।

(MSDN से, उदा https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogpermission(v=vs.110).aspx)

इस प्रकार, IsInRole डिफ़ॉल्ट प्रति इच्छा उपयोगकर्ता विशेषाधिकार पर विचार, और इस प्रकार विधि अवास्तविक लौटाते। केवल तभी सत्य जब सॉफ़्टवेयर स्पष्ट रूप से व्यवस्थापक के रूप में चलाया जाता है।

https://ayende.com/blog/158401/are-you-an-administrator में एडी की जांच करने वाला अन्य तरीका यह जांच करेगा कि उपयोगकर्ता नाम किसी व्यवस्थापक समूह में है या नहीं। झूठी checkCurrentRole अगर सच ==,:

मेरे पूरा विधि के संयोजन दोनों इस प्रकार है:

public static bool IsCurrentUserAdmin(bool checkCurrentRole = true) 
    { 
     bool isElevated = false; 

     using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) 
     { 
      if (checkCurrentRole) 
      { 
       // Even if the user is defined in the Admin group, UAC defines 2 roles: one user and one admin. 
       // IsInRole consider the current default role as user, thus will return false! 
       // Will consider the admin role only if the app is explicitly run as admin! 
       WindowsPrincipal principal = new WindowsPrincipal(identity); 
       isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); 
      } 
      else 
      { 
       // read all roles for the current identity name, asking ActiveDirectory 
       isElevated = IsAdministratorNoCache(identity.Name); 
      } 
     } 

     return isElevated; 
    } 

    /// <summary> 
    /// Determines whether the specified user is an administrator. 
    /// </summary> 
    /// <param name="username">The user name.</param> 
    /// <returns> 
    /// <c>true</c> if the specified user is an administrator; otherwise, <c>false</c>. 
    /// </returns> 
    /// <seealso href="https://ayende.com/blog/158401/are-you-an-administrator"/> 
    private static bool IsAdministratorNoCache(string username) 
    { 
     PrincipalContext ctx; 
     try 
     { 
      Domain.GetComputerDomain(); 
      try 
      { 
       ctx = new PrincipalContext(ContextType.Domain); 
      } 
      catch (PrincipalServerDownException) 
      { 
       // can't access domain, check local machine instead 
       ctx = new PrincipalContext(ContextType.Machine); 
      } 
     } 
     catch (ActiveDirectoryObjectNotFoundException) 
     { 
      // not in a domain 
      ctx = new PrincipalContext(ContextType.Machine); 
     } 
     var up = UserPrincipal.FindByIdentity(ctx, username); 
     if (up != null) 
     { 
      PrincipalSearchResult<Principal> authGroups = up.GetAuthorizationGroups(); 
      return authGroups.Any(principal => 
            principal.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid)); 
     } 
     return false; 
    } 

ऊपर उठाया विशेषाधिकार के बिना एक व्यवस्थापक समूह में एक उपयोगकर्ता के लिए (UAC सक्षम), इस विधि IsCurrentUserAdmin() लौट checkCurrentRole! लेकिन झूठी अगर चेककुरेंट्रोल == सच

यदि आप कोड विशेषाधिकार प्राप्त करने वाले कोड को चलाते हैं, तो चेककुरेंट्रोल == सत्य पर विचार करें। अन्यथा, तब तक आपको एक सुरक्षा अपवाद मिलेगा। इसलिए सही IsInRole तर्क।

संबंधित मुद्दे