पता लगाएँ कि क्या प्रशासक के रूप में या उन्नत विशेषाधिकार के बिना चल रहा है?


82

मेरे पास एक एप्लिकेशन है जिसे यह पता लगाने की आवश्यकता है कि यह उन्नत विशेषाधिकार के साथ चल रहा है या नहीं। मेरे पास वर्तमान में इस तरह का कोड है:

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

यह पता लगाने के लिए काम करता है कि उपयोगकर्ता प्रशासक है या नहीं, लेकिन बिना ऊंचाई के प्रशासक के रूप में चलने पर काम नहीं करता है। (उदाहरण के लिए vshost.exe में)।

मैं यह कैसे निर्धारित कर सकता हूं कि उत्थान [पहले से लागू है या संभव है] ?

जवाबों:


55

इसे आज़माएं:

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;

public static class UacHelper
{
    private const string uacRegistryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    private const string uacRegistryValue = "EnableLUA";

    private static uint STANDARD_RIGHTS_READ = 0x00020000;
    private static uint TOKEN_QUERY = 0x0008;
    private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);

    [DllImport("advapi32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength);

    public enum TOKEN_INFORMATION_CLASS
    {
        TokenUser = 1,
        TokenGroups,
        TokenPrivileges,
        TokenOwner,
        TokenPrimaryGroup,
        TokenDefaultDacl,
        TokenSource,
        TokenType,
        TokenImpersonationLevel,
        TokenStatistics,
        TokenRestrictedSids,
        TokenSessionId,
        TokenGroupsAndPrivileges,
        TokenSessionReference,
        TokenSandBoxInert,
        TokenAuditPolicy,
        TokenOrigin,
        TokenElevationType,
        TokenLinkedToken,
        TokenElevation,
        TokenHasRestrictions,
        TokenAccessInformation,
        TokenVirtualizationAllowed,
        TokenVirtualizationEnabled,
        TokenIntegrityLevel,
        TokenUIAccess,
        TokenMandatoryPolicy,
        TokenLogonSid,
        MaxTokenInfoClass
    }

    public enum TOKEN_ELEVATION_TYPE
    {
        TokenElevationTypeDefault = 1,
        TokenElevationTypeFull,
        TokenElevationTypeLimited
    }

    public static bool IsUacEnabled
    {
        get
        {
            RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false);
            bool result = uacKey.GetValue(uacRegistryValue).Equals(1);
            return result;
        }
    }

    public static bool IsProcessElevated
    {
        get
        {
            if (IsUacEnabled)
            {
                IntPtr tokenHandle;
                if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
                {
                    throw new ApplicationException("Could not get process token.  Win32 Error Code: " + Marshal.GetLastWin32Error());
                }

                TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;

                int elevationResultSize = Marshal.SizeOf((int)elevationResult);
                uint returnedSize = 0;
                IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);

                bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize);
                if (success)
                {
                    elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr);
                    bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
                    return isProcessAdmin;
                }
                else
                {
                    throw new ApplicationException("Unable to determine the current elevation.");
                }
            }
            else
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                bool result = principal.IsInRole(WindowsBuiltInRole.Administrator);
                return result;
            }
        }
    }
}

8
यदि खाता स्थानीय व्यवस्थापक के रूप में चलने के लिए काम करता है, लेकिन यदि आप डोमेन व्यवस्थापक का उपयोग करते हैं तो चर isProcessAdmin गलत है। लेकिन UAC डोमेन एडमिनिस्ट्रेटर को तब मान्य करता है जब विशेषाधिकार को बढ़ाते हुए (विंडोज़ में फ़ोल्डर बनाएं, व्यवस्थापक के रूप में चलाएं, आदि) ... मैं आपके फ़ंक्शन को कैसे संशोधित कर सकता हूं, इसलिए यह उस मामले को भी ध्यान में रखता है?
VSP

1
आप यह भी विचार कर सकते हैं कि यदि खाता व्यवस्थापक में बनाया गया है, तो UAC डिफ़ॉल्ट रूप से ऊंचा हो जाता है, इसलिए IsProcessElevated इस मामले में गलत वापस आ जाएगा (क्योंकि IsUacEnabled सत्य है और एलिवेशन। TokenElevitTypeDefault है) भले ही प्रक्रिया उन्नत मोड में बिना चल रही हो। उपयोगकर्ता को संकेत दिया। या दूसरे शब्दों में खाता ऊंचा है और प्रक्रिया डिफ़ॉल्ट ऊंचाई प्रकार में चलती है।
मिस्टर कुक

2
इस कोड को बयानों का उपयोग करके निम्नलिखित की आवश्यकता है: System.Diagnostics का उपयोग करना; System.Runtime.InteropServices का उपयोग कर; System.Security.Principal का उपयोग कर; यह भी यहाँ
स्कॉट सोल्मर

यह मुझे विंडोज 8 पर एक अपवाद मिला, मुझे Marshal.SizeOf((int)elevationResult)यकीन नहीं है कि अभी तक क्यों। अपवाद संदेश है: विधि नहीं मिली। At:Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
CularBytes

TokenElevationTypeLimited के बारे में क्या? क्या इसे सच में isProcessAdmin सेट करने के लिए नहीं माना जाना चाहिए?
ओलिवियर मैट्रो

34

( सवाल पूछे जाने के छह साल बाद नया जवाब )

अस्वीकरण: यह केवल कुछ ऐसा है जो मेरे विशेष ओएस पर मेरे विशेष उपयोगकर्ता के साथ मेरी ओएस पर काम करने के लिए हुआ है:

using System.Security.Principal;

// ...

    static bool IsElevated
    {
      get
      {
        return WindowsIdentity.GetCurrent().Owner
          .IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid);
      }
    }

इसलिए जब मैं इस "रन ऐज़ एडमिनिस्ट्रेटर" को चलाता हूं, तो प्रॉपर्टी getऐक्सेसर लौट आता है true। जब सामान्य रूप से चल रहा हो (भले ही मेरा उपयोगकर्ता "व्यवस्थापक" हो, तो बस इस विशेष एप्लिकेशन को "व्यवस्थापक" के रूप में नहीं चलाएं), यह वापस आ जाता है false

यह कई अन्य उत्तरों की तुलना में बहुत सरल लगता है।

मुझे कोई पता नहीं है अगर ऐसे मामले हैं जहां यह विफल रहता है।

पुनश्च! यह भी ठीक लगता है:

    static bool IsElevated
    {
      get
      {
        var id = WindowsIdentity.GetCurrent();
        return id.Owner != id.User;
      }
    }

1
इसके लिए धन्यवाद! -। मैं PowerShell [Security.Principal.WindowsIdentity] :: GetCurrent () Owner.IsWellKnown ([System.Security.Principal.WellKnownSidType] :: BuiltinAdministratorsSid) में यह प्रयोग किया जाता है
लुईस

नोटिफिकेशन को 'कभी कोई नोटिफिकेशन न दिखाने' के लिए सेट करने पर, यह सच हो जाएगा। शायद कुछ परिदृश्य में जहां आपको वास्तव में सॉफ़्टवेयर को चलाने की आवश्यकता है प्रशासक के रूप में यह एक गलत संकेत दे सकता है।
CularBytes

2
यह "अर्ध-असम्बद्ध" प्रक्रिया और एक ठीक-असम्बद्ध प्रक्रिया के बीच अंतर नहीं करेगा: यह संभव है कि IsElevatedझूठी वापस आ जाएगी लेकिन प्रक्रिया अभी भी उच्च अखंडता स्तर के साथ चल रही हो सकती है। वास्तव में गैर-उच्चीकृत प्रक्रिया का एक मध्यम अखंडता स्तर होता है। यह संभवतः 99% अनुप्रयोगों के लिए अप्रासंगिक है, लेकिन यह ध्यान देने योग्य है क्योंकि प्रोसेस हैकर जैसे उपकरण अभी भी इस तरह की प्रक्रिया को ऊंचा घोषित कर सकते हैं। एक "अर्ध-असम्बद्ध" प्रक्रिया ऐसी चीज नहीं है जिसे आप सामान्य रूप से देखेंगे; यह तब हो सकता है जब कोई एक असमान बाल प्रक्रिया को सही ढंग से लॉन्च करने में विफल रहता है।
रोमन स्टार्कोव

Whats "उच्च अखंडता स्तर के साथ चल रहा है"?
स्टिंगजैक

@StingyJack टिप्पणियों में जवाब देने के लिए एक सवाल का बहुत बड़ा है, लेकिन यहां और यहां देखें
रोमन स्टार्कोव

19

यहाँ इस उत्तर का एक संशोधित संस्करण है जिसमें संसाधनों के उचित निपटान और डोमेन प्रशासकों को संभालने जैसी चीजें शामिल हैं।

public static class UacHelper
{
    private const string uacRegistryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    private const string uacRegistryValue = "EnableLUA";

    private static uint STANDARD_RIGHTS_READ = 0x00020000;
    private static uint TOKEN_QUERY = 0x0008;
    private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);

    [DllImport("advapi32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool CloseHandle(IntPtr hObject);

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength);

    public enum TOKEN_INFORMATION_CLASS
    {
        TokenUser = 1,
        TokenGroups,
        TokenPrivileges,
        TokenOwner,
        TokenPrimaryGroup,
        TokenDefaultDacl,
        TokenSource,
        TokenType,
        TokenImpersonationLevel,
        TokenStatistics,
        TokenRestrictedSids,
        TokenSessionId,
        TokenGroupsAndPrivileges,
        TokenSessionReference,
        TokenSandBoxInert,
        TokenAuditPolicy,
        TokenOrigin,
        TokenElevationType,
        TokenLinkedToken,
        TokenElevation,
        TokenHasRestrictions,
        TokenAccessInformation,
        TokenVirtualizationAllowed,
        TokenVirtualizationEnabled,
        TokenIntegrityLevel,
        TokenUIAccess,
        TokenMandatoryPolicy,
        TokenLogonSid,
        MaxTokenInfoClass
    }

    public enum TOKEN_ELEVATION_TYPE
    {
        TokenElevationTypeDefault = 1,
        TokenElevationTypeFull,
        TokenElevationTypeLimited
    }

    public static bool IsUacEnabled
    {
        get
        {
            using (RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false))
            {
                bool result = uacKey.GetValue(uacRegistryValue).Equals(1);
                return result;
            }
        }
    }

    public static bool IsProcessElevated
    {
        get
        {
            if (IsUacEnabled)
            {
                IntPtr tokenHandle = IntPtr.Zero;
                if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
                {
                    throw new ApplicationException("Could not get process token.  Win32 Error Code: " +
                                                   Marshal.GetLastWin32Error());
                }

                try
                {
                    TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;

                    int elevationResultSize = Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE));
                    uint returnedSize = 0;

                    IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);
                    try
                    {
                        bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType,
                                                           elevationTypePtr, (uint) elevationResultSize,
                                                           out returnedSize);
                        if (success)
                        {
                            elevationResult = (TOKEN_ELEVATION_TYPE) Marshal.ReadInt32(elevationTypePtr);
                            bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
                            return isProcessAdmin;
                        }
                        else
                        {
                            throw new ApplicationException("Unable to determine the current elevation.");
                        }
                    }
                    finally
                    {
                        if (elevationTypePtr != IntPtr.Zero)
                            Marshal.FreeHGlobal(elevationTypePtr);
                    }
                }
                finally
                {
                    if (tokenHandle != IntPtr.Zero)
                        CloseHandle(tokenHandle);
                }
            }
            else
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                bool result = principal.IsInRole(WindowsBuiltInRole.Administrator) 
                           || principal.IsInRole(0x200); //Domain Administrator
                return result;
            }
        }
    }
}

यह सब निर्भर करता है कि आप किस उपयोगकर्ता के रूप में सेवा चला रहे हैं। क्या आप यह पता लगाने की कोशिश कर रहे हैं कि सेवा स्थानीय प्रणाली, स्थानीय सेवा, नेटवर्क सेवा, या विंडोज़ उपयोगकर्ता के रूप में चल रही है या नहीं? लोकल सिस्टम और लोकल सर्विस के बीच के अंतर को बताने के लिए "प्रशासनिक स्थिति" का पता लगाने का काम न करें, इसके लिए आपको सीधे जांच करनी होगी कि यूजर किस प्रक्रिया को चला रहा है।
स्कॉट चैंबरलेन

यह मुझे विंडोज 8 पर एक अपवाद मिला, मुझे Marshal.SizeOf((int)elevationResult)यकीन नहीं है कि अभी तक क्यों। अपवाद संदेश है: विधि नहीं मिली। At:Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
CularBytes

@RageCompex आप एक सार्वभौमिक ऐप या यूनिटी 3 डी जैसे प्रतिबंधित प्लेटफॉर्म का उपयोग कर रहे हैं?
स्कॉट चैंबरलेन

1
आह, आप 4.5.1 के साथ संकलन कर रहे हैं क्योंकि यह इस अधिभार का उपयोग करने की कोशिश कर रहा है, लेकिन उपयोगकर्ता के पास 4.5.1 स्थापित नहीं है। इसके साथ बदलने की कोशिश करें Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE)),
स्कॉट चेम्बरलेन

2
@ScottChamberlain 32 बिट एप्लिकेशन .NET 4.0 पर int elevationResultSize = Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE))फेंकता है , हालांकि ArgumentException, int elevationResultSize = Marshal.SizeOf((int)elevationResult)काम करता है।
मार्टिन ब्रौन

16

CodePlex परियोजना UAChelper कोड कि UserAccountControl.cpp में ऊंचाई पर जाँच करता है है UserAccountControl::IsUserAdmin, कि जांच करता है कि यूएसी सक्षम किया गया है और उसके बाद जांच करता है कि प्रक्रिया ऊंचा है।

bool UserAccountControl::IsCurrentProcessElevated::get()
{
    return GetProcessTokenElevationType() == TokenElevationTypeFull;    //elevated
}

समारोह से:

int UserAccountControl::GetProcessTokenElevationType()
{
    HANDLE hToken;
    try
    {
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
            throw gcnew Win32Exception(GetLastError());

        TOKEN_ELEVATION_TYPE elevationType;
        DWORD dwSize;
        if (!GetTokenInformation(hToken, TokenElevationType, &elevationType, sizeof(elevationType), &dwSize))
            throw gcnew Win32Exception(GetLastError());

        return elevationType;
    }
    finally
    {
        CloseHandle(hToken);
    }
}

10

.Net Framwork 4.5 में मुझे एक और तरीका मिला जो मेरे लिए काम करता है। निम्नलिखित लिपि के संबंध में जो यहां (जर्मन में) मिल सकती है

 rem --- Admintest.bat ---
 whoami /groups | find "S-1-5-32-544" > nul
 if errorlevel 1 goto ende
 echo Benutzer %username% ist lokaler Administrator.
 :ende

C # में यह इस तरह दिखता है:

    private bool IsAdmin
    {
        get
        {
            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;
        }
    }

लेकिन .net <4.5 WindowsPrincipalवर्ग में UserClaimsसंपत्ति शामिल नहीं है और मुझे यह जानकारी प्राप्त करने का कोई तरीका नहीं मिला।


FYI करें: केवल यह निर्धारित करने पर कि क्या खाता व्यवस्थापिका है, न कि यदि एप्लिकेशन उन्नत है
CularBytes

यह जांचने के लिए कि क्या उपयोगकर्ता .Net <4.5 में S-1-5-32-544 (प्रशासक समूह) का सदस्य है, आप मूल प्रश्न में कोड का उपयोग कर सकते हैं। यदि प्रक्रिया उन्नत है और उपयोगकर्ता समूह में है, तो प्रिंसिपल केवल प्रशासक समूह का सदस्य होगा। यदि प्रक्रिया को ऊंचा नहीं किया जाता है तो प्रिंसिपल समूह में नहीं होगा।
एडम

1
अच्छा जवाब, लघु और कुशल, मैंने आपको इसके लिए +1 दिया। NB मैंने इसे अपने कोड ( private bool IsAdmin{ get { ... } }) में एक संपत्ति बनाया है , तो अगर आपको आह्वान करना है तो आपको कोष्ठक की आवश्यकता नहीं है IsAdmin
मैट

4

उपयोग TokenElevationTypeकरना काम करेगा, लेकिन यदि आप CheckTokenMembership()एडमिन ग्रुप SID के खिलाफ PInvoke करते हैं, तो UAC बंद होने पर और 2000 / XP / 2003 में आपका कोड भी काम करेगा और इनकार SID को भी हैंडल करेगा।

एक IsUserAnAdmin()फ़ंक्शन भी है जो CheckTokenMembershipआपके लिए चेक करता है , लेकिन MSDN कहता है कि यह हमेशा के लिए नहीं हो सकता है


UAC के अधीन होने पर मुझे CheckTokenMembership अपर्याप्त मिली - github.com/chx10y/choco/blob/… असत्य। कोड की जाँच करें (मैं इसे बदल रहा हूं) और Win2012R2 से आउटपुट पर एक नज़र डालूंगा - i.imgur.com/gX3JP0W.png
ferventcoder

@ferventcoder यह इस बात पर निर्भर करता है कि आप वास्तव में क्या जानना चाहते हैं; उपयोगकर्ता अभी एक उन्नत प्रशासक है या यदि आवश्यक हो तो वे बढ़ा सकते हैं। आप उदाहरण के लिए TOKEN_ELEVATION_TYPE की जाँच कर सकते हैं और कुछ इस तरह से समाप्त कर सकते हैं: bool is_or_can_elevate () {return process_is_elevated () || TokenElevationTypeLimited == get_current_token_elevation_type (); }। एक और मुद्दा यह है कि उन्नत की परिभाषा हर जगह समान नहीं है, आपके पास "प्रशासक:" उपसर्ग के साथ एक कंसोल विंडो हो सकती है और एक ही समय में उच्च अखंडता स्तर से नीचे हो सकती है! TokenElevation हमेशा TokenIntegrityLevel से मेल नहीं खाता है।
एंडर्स

मनोरंजन समय। मैं जानना चाहता हूं कि क्या मेरे पास उपयोगकर्ता से प्रशासक है या नहीं, एक अलग प्रक्रिया है। यहीं पर मेरा अंत हुआ। मुझे बताएं कि अगर गलत हो तो मुझे कहां जाना चाहिए - github.com/chatalogy/choco/issues/77#issuecomment-73523774 और github.com/chx10y/choco/commit/…
ferventcoder 22

@ferventcoder is_processes_elevated () {वापसी CheckTokenMembership / IsInRole || TokenElevation / TokenIntegrityLevel> = 0x3000; } CheckTokenMembership या IsInRole के लिए <विस्टा और विस्टा + UAC के साथ बंद। TokenElevation या TokenIntegrityLevel> = 0x3000 इस बात पर निर्भर करता है कि आप ऊँचाई का पता कैसे लगाना चाहते हैं। मैं conhost.exe का उपयोग करता है का मानना है TokenElevation लेकिन यह IMHO टूट गया है और आप वास्तविक स्तर की जाँच करनी चाहिए ... यह भी देखें (आप एक टोकन उत्पन्न करने के लिए है कि मूर्खों TokenElevation हालांकि विशेष उपकरण की जरूरत है): windowssucks.wordpress.com/2011/02/07 / uac-are-you-high / #
एंडर्स

... और यहां तक ​​कि यह गलत है, सिद्धांत रूप में यह एक ऊंचा टोकन होना संभव है और प्रशासक समूह में नहीं है। इसलिए यदि आप केवल प्रशासक समूह के लोगों को चाहते हैं और यह सुनिश्चित करते हैं कि वे ऊंचे हैं तो आपको CheckTokenMembership / IsInRole चेक का प्रदर्शन करना चाहिए और फिर टोकन * चेक विफल होना चाहिए (कोई UAC) या यह मान बढ़ना चाहिए ... यह निश्चित रूप से निर्भर करता है आप वास्तव में क्या उपयोग करना चाहते हैं। आपको सिस्टम / एडमिन और एलीवेटेड होना चाहिए, या सिर्फ ऊंचा होना चाहिए, यह ACL पर निर्भर करता है।
एंडर्स

4

इस उत्तर में कुछ समस्याएं हैं। सबसे पहले, इसे कोई भी सिस्टम प्रक्रिया नहीं मिलती है जो व्यवस्थापक के रूप में चलती है (उदाहरण के लिए NT- प्राधिकरण / सिस्टम के तहत)। नीचे दिए गए कोड का उदाहरण सभी समस्याओं को ठीक करता है (पता लगाता है, LocalAdmins, DomainAdmins, और LocalSystemAdmins)

तुम सिर्फ वर्तमान प्रक्रिया चाहते हैं, की जगह pHandleके साथProcess.GetCurrentProcess().Handle

नोट: इसे चलाने के लिए आपके पास कुछ विशेषाधिकार होने चाहिए। (प्रत्येक एडमिनप्रोसेस के पास उन्हें है लेकिन पहले उन्हें सक्रिय करने की आवश्यकता है, सेवाओं ने उन्हें डिफ़ॉल्ट रूप से सक्रिय किया है)

internal static bool IsProcessElevatedEx(this IntPtr pHandle) {

        var token = IntPtr.Zero;
        if (!OpenProcessToken(pHandle, MAXIMUM_ALLOWED, ref token))
                throw new Win32Exception(Marshal.GetLastWin32Error(), "OpenProcessToken failed");

        WindowsIdentity identity = new WindowsIdentity(token);
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        bool result = principal.IsInRole(WindowsBuiltInRole.Administrator)
                   || principal.IsInRole(0x200); //Domain Administrator
        CloseHandle(token);
        return result;
}

1

मुझे लगता है कि एक और मुद्दा है। मैंने आपके द्वारा प्रदान किए गए समाधानों की जाँच की और यह कहना है कि विंडोज 7 की स्थापना में और एक व्यवस्थापक के रूप में लॉग ऑन किया गया, चेक काम नहीं करता है। Windows कभी भी ऐसी जानकारी नहीं देता है जो एक उन्नत मोड में चलती है। तो अनुक्रम:

if (IsUacEnabled)
    return IsProcessInElevatedMode();
return IsUserAdmin();

एक व्यवस्थापक के रूप में लॉग इन करने पर सही रिटर्न नहीं होता है, लेकिन प्रक्रिया में सिस्टम ऑपरेशन (जैसे स्टॉप सिस्टम सर्विसेज) करने के लिए सभी विशेषाधिकार हैं। कार्य क्रम है:

if (IsUserAdmin())
    return true;

if (IsUacEnabled)
    return IsProcessInElevatedMode();

return false;

यदि प्रक्रिया व्यवस्थापक संदर्भ में चलती है, तो आपको पहले जाँचना चाहिए। अतिरिक्त जानकारी:

IsUacEnabled() - checks if the UAC has been enabled in the system (Windows)
IsProcessInElevatedMode() - checks if the process is run in an elevated mode
IsUserAdmin() - checks if the current user has an Administrtor role

उन सभी विधियों का वर्णन पिछले पोस्टों में किया गया है।


1
यह एक उत्तर नहीं है, लेकिन यकीनन एक और पोस्ट पर टिप्पणी है
मिकी डी

1

UACHelper nuget पैकेज का उपयोग करना : https://www.nuget.org/packages/UACHelper/

if (UACHelper.IsElevated)
    // something
else
    // something else

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

अधिक जानकारी के लिए मुझे पढ़ने की जाँच करें।


0

मैं इस कोड का उपयोग कर रहा हूं और यह अच्छी तरह से काम करता है:


bool runningAsAdmin = WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid);

* एडमिन बिल्ड-इन एडमिनिस्ट्रेटर ग्रुप का हिस्सा है।

"सिस्टम व्यवस्थापक के लिए एक उपयोगकर्ता खाता। यह खाता ऑपरेटिंग सिस्टम इंस्टॉलेशन के दौरान बनाया गया पहला खाता है। खाता हटाया या लॉक नहीं किया जा सकता है। यह व्यवस्थापक समूह का सदस्य है और उस समूह से हटाया नहीं जा सकता है।" - https://ss64.com/nt/syntax-security_groups.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.