मैंने प्रासंगिक स्टैक ओवरफ़्लो प्रश्न पढ़े हैं और निम्नलिखित कोड को आज़माया है:

WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;

यह सच नहीं है, भले ही मैंने मैन्युअल रूप से पुष्टि की है कि वर्तमान उपयोगकर्ता स्थानीय अंतर्निहित व्यवस्थापक समूह का सदस्य है।

मुझे किसकी याद आ रही है ?

धन्यवाद।

3
Darryl Hoar 12 जून 2017, 22:17
जब आपका "वर्तमान उपयोगकर्ता" इस कोड को चलाता है और इसे व्यवस्थापक के रूप में चलाता है तो क्या आपके कोड का अलग आउटपुट होता है?
 – 
George Alexandria
12 जून 2017, 22:37
3
आपको कोड को एक व्यवस्थापक के रूप में चलाना होगा। यदि आप विजुअल स्टूडियो के माध्यम से चल रहे हैं, तो पहले वीएस को व्यवस्थापक के रूप में लॉन्च करें।
 – 
Rufus L
12 जून 2017, 22:58
आह, यह नहीं पता था कि इसे व्यवस्थापक के रूप में चलाना था। मैं इसे एक विनफॉर्म एप्लिकेशन में उपयोग कर रहा था और यह निर्धारित करने में सक्षम होना चाहता था कि वर्तमान उपयोगकर्ता एक व्यवस्थापक उपयोगकर्ता था या नहीं। ड्रॉइंग बोर्ड पर वापस। धन्यवाद।
 – 
Darryl Hoar
12 जून 2017, 23:27
@RufusL, क्या यह जांचना संभव है कि क्या वर्तमान उपयोगकर्ता के पास एप्लिकेशन से व्यवस्थापकीय अधिकार हैं, जो नो-एडमिन मोड में चल रहा है?
 – 
Alexan
30 नवम्बर 2017, 02:03
मुझे ऐसा विश्वास है, मुझे नीचे एक उत्तर पोस्ट करने दें ताकि आप इसे आजमा सकें
 – 
Rufus L
30 नवम्बर 2017, 03:25

2 जवाब

आपके द्वारा ऊपर दिया गया कोड केवल व्यवस्थापक के रूप में चलने पर ही काम करता प्रतीत होता है, हालांकि आप नीचे दिए गए कोड की तरह कुछ करके यह देखने के लिए क्वेरी कर सकते हैं कि उपयोगकर्ता स्थानीय व्यवस्थापक समूह (व्यवस्थापक के रूप में चलाए बिना) से संबंधित है या नहीं। ध्यान दें, हालांकि, समूह का नाम हार्ड-कोडेड है, इसलिए मुझे लगता है कि यदि आप इसे विभिन्न भाषाओं के ऑपरेटिंग सिस्टम पर चलाना चाहते हैं तो आपको कुछ स्थानीयकरण कार्य करना होगा।

using (var pc = new PrincipalContext(ContextType.Domain, Environment.UserDomainName))
{
    using (var up = UserPrincipal.FindByIdentity(pc, WindowsIdentity.GetCurrent().Name))
    {
        return up.GetAuthorizationGroups().Any(group => group.Name == "Administrators");
    }
}

ध्यान दें कि आप दूसरे using ब्लॉक के अंदर ऐसा करके उन सभी समूहों की सूची प्राप्त कर सकते हैं जिनका उपयोगकर्ता सदस्य है:

var allGroups = up.GetAuthorizationGroups();

लेकिन वे कितने समूहों के सदस्य हैं, इस पर निर्भर करते हुए यह बहुत धीमा होगा। उदाहरण के लिए, मैं 638 समूहों में हूं और जब मैं इसे चलाता हूं तो इसमें 15 सेकंड लगते हैं।

2
Rufus L 30 नवम्बर 2017, 03:54

यह जांचने का दूसरा तरीका है कि क्या उपयोगकर्ता व्यवस्थापक है, व्यवस्थापक के रूप में एप्लिकेशन नहीं चला रहा है:

private static bool  IsAdmin()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            if (identity != null)
            {
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                List<Claim> list = new List<Claim>(principal.UserClaims);
                Claim c = list.Find(p => p.Value.Contains("S-1-5-32-544"));
                if (c != null)
                    return true;
            }
            return false;
        }

श्रेय इस उत्तर को है, लेकिन कोड में थोड़ा सुधार किया गया है।

2
Alexan 2 पद 2017, 01:05
यह पहला उचित (और तेज़ कोड) उत्तर है जो मुझे इस प्रश्न का मिला है। वेब में मुझे मिले अन्य सभी उत्तर धीमे हैं या यूएसी के साथ काम नहीं करते हैं (या जाँच की गई है कि क्या वर्तमान प्रक्रिया वर्तमान में उन्नत है) या अन्य तरीके से काम नहीं किया। हालाँकि हार्डकोडेड "S-1-5-32-544" का उपयोग करने के बजाय आप var sid = new SecurityIdentifier (WellKnownSidType.BuiltinAdministratorsSid, null) और फिर sid.Value का उपयोग कर सकते हैं।
 – 
user2261015
18 सितंबर 2019, 13:13
या थोड़े बेहतर संस्करण के रूप में private static bool IsAdmin() { var identity = WindowsIdentity.GetCurrent(); if (identity != null) { var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); var principal = new WindowsPrincipal(identity); return principal.UserClaims.Any(x => x.Value.Contains(sid.Value)); } return false; }
 – 
user2261015
18 सितंबर 2019, 13:23