Yönetici olarak yükseltilmiş ayrıcalıklara sahip mi yoksa yoksa yönetici olarak mı çalıştığını tespit et?


82

Yükseltilmiş ayrıcalıklarla çalışıp çalışmadığını tespit etmesi gereken bir uygulamam var. Şu anda şu şekilde bir kod ayarım var:

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

Bu, bir kullanıcının yönetici olup olmadığını tespit etmek için çalışır, ancak yönetici olarak yükseltme olmadan çalıştırılıyorsa çalışmaz. (Örneğin vshost.exe içinde).

Yüksekliğin [halihazırda yürürlükte veya] mümkün olup olmadığını nasıl belirleyebilirim ?

Yanıtlar:


55

Şunu deneyin:

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
Hesap yerel yönetici olarak çalıştırılırsa çalışır, ancak etki alanı yöneticisini kullanırsanız isProcessAdmin değişkeni false döndürür. Ancak UAC, ayrıcalıkları yükseltirken (pencerelerde klasör oluşturma, yönetici olarak çalıştırma, vb.) Etki Alanı Yöneticisini geçerli olarak kabul eder ... Bu durumu da dikkate alacak şekilde işlevinizi nasıl değiştirebilirim?
VSP

1
Ayrıca, hesap yerleşik yönetici ise, UAC varsayılan olarak yükseltilir, bu nedenle bu durumda IsProcessElevated'ın yanlış döndürdüğünü (çünkü IsUacEnabled doğrudur ve elevationResult, TokenElevationTypeDefault'dur), işlem gerekmeden yükseltilmiş modda çalışsa bile kullanıcıya sordu. Veya başka bir deyişle, hesap yükseltilir ve işlem varsayılan yükseltme türünde çalışır.
Mister Cook

2
Bu kod, aşağıdaki using ifadelerini gerektirir: using System.Diagnostics; System.Runtime.InteropServices kullanarak; System.Security.Principal kullanarak; Burada da aynalanmış görünüyor .
Scott Solmer

Bu, Windows 8'de bana bir istisna getirdi, Marshal.SizeOf((int)elevationResult)neden henüz emin değilim. İstisna mesajı: Yöntem bulunamadı. Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
Şurada

TokenElevationTypeLimited ne olacak? İsProcessAdmin'in true olarak ayarlanması düşünülmemeli mi?
Olivier MATROT

34

( soru sorulduktan altı yıl sonra yeni cevap )

Sorumluluk reddi: Bu, yalnızca belirli bir kullanıcıyla kendi özel ayarlarımla kendi işletim sistemimde işe yarayan bir şey:

using System.Security.Principal;

// ...

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

Bu yüzden "Yönetici olarak çalıştır" ı çalıştırdığımda, özellik geterişimcisi geri dönüyor true. Normal olarak çalışırken (kullanıcım "yönetici" olsa bile, bu belirli uygulamayı yönetici olarak "çalıştırmıyorsa"), geri döner false.

Bu, diğer birçok cevaptan çok daha basit görünüyor.

Bunun başarısız olduğu durumlar olup olmadığı hakkında hiçbir fikrim yok.

PS! Bu da iyi görünüyor:

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

1
Bunun için teşekkürler! - Bunu PowerShell'de kullandım [Security.Principal.WindowsIdentity] :: GetCurrent (). Owner.IsWellKnown ([System.Security.Principal.WellKnownSidType] :: BuiltinAdministratorsSid)
Lewis

Bildirimleri 'hiçbir zaman herhangi bir bildirim gösterme' olarak ayarladığınızda, bu doğru olacaktır. Belki de yazılımı gerçekten yönetici olarak çalıştırmanız gereken bazı senaryolarda yanlış bir gösterge olabilir.
CularBytes

2
Bu, "yarı geciktirilmemiş" süreç ile uygun şekilde gözden geçirilmemiş bir süreç arasında ayrım yapmayacaktır: IsElevatedyanlış döndürmek mümkündür, ancak süreç hala Yüksek bütünlük seviyesinde çalışıyor olabilir. Gerçekten yükseltilmemiş bir süreç, orta bir bütünlük düzeyine sahiptir. Bu muhtemelen uygulamaların% 99'u için alakasızdır, ancak bahsetmeye değer çünkü Process Hacker gibi araçlar hala böyle bir sürecin yükseltileceğini ilan edebilir. "Yarı işlenmemiş" bir süreç, normalde göreceğiniz bir şey değildir; birisi, geciktirilmemiş bir çocuk sürecini doğru şekilde başlatamadığında ortaya çıkabilir.
Roman Starkov

"Yüksek bütünlük seviyesinde çalışan" nedir?
StingyJack

@StingyJack, yorumlarda cevaplanamayacak kadar büyük bir soru, ama buraya ve buraya bakın .
Roma Starkov

19

Burada, kaynakların uygun şekilde elden çıkarılması ve Etki Alanı Yöneticilerinin kullanılması gibi şeyleri içerecek şekilde bu cevabın değiştirilmiş bir versiyonu bulunmaktadır .

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;
            }
        }
    }
}

Her şey, hizmeti hangi kullanıcı olarak çalıştırdığınıza bağlıdır. Hizmetin Yerel Sistem, Yerel Hizmet, Ağ Hizmeti veya bir Windows kullanıcısı olarak çalıştığını tespit etmeye mi çalışıyorsunuz? "Yönetim durumu" nun algılanması, Yerel Sistem ve Yerel Hizmet arasındaki farkı anlatmak için işe yaramaz, işlemi hangi kullanıcının çalıştırdığını doğrudan kontrol ederek bunu test etmeniz gerekir.
Scott Chamberlain

Bu, Windows 8'de bana bir istisna getirdi, Marshal.SizeOf((int)elevationResult)neden henüz emin değilim. İstisna mesajı: Yöntem bulunamadı. Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
Şurada

@RageCompex, evrensel bir uygulama veya Unity3d gibi kısıtlı bir platform mu kullanıyorsunuz?
Scott Chamberlain

1
Ah, 4.5.1 ile derliyorsunuz çünkü bu aşırı yüklemeyi kullanmaya çalışıyor ancak kullanıcı 4.5.1 kurulu değil. İle değiştirmeyi deneyin Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE)),
Scott Chamberlain

2
@ScottChamberlain 32 Bitlik bir uygulama .NET 4.0 int elevationResultSize = Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE))atar , ancak çalıştı. ArgumentExceptionint elevationResultSize = Marshal.SizeOf((int)elevationResult)
Martin Braun

16

Codeplex projesi UAChelper UserAccountControl.cpp içinde kotunda kontroller bu kodu vardır UserAccountControl::IsUserAdminUAC etkinse çekler olduğunu ve sonra çek işlem yükselmiş olup olmadığını.

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

işlevden:

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'te benim için çalışan başka bir yöntem buldum. Burada bulabilirsiniz aşağıdaki komut ilgili olarak burada (Almanca)

 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 # 'da şuna benzer:

    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;
        }
    }

Ancak .net <4.5'te WindowsPrincipalsınıf UserClaimsözelliği içermiyor ve bu bilgiyi almanın bir yolunu bulamadım.


Bilginize: Uygulamanın yükseltilip yükseltilmediğini değil, yalnızca hesabın yönetici olup olmadığını belirleme
CularBytes

Bir kullanıcının .Net <4.5'te S-1-5-32-544 (Yöneticiler grubu) üyesi olup olmadığını kontrol etmek için, orijinal sorudaki kodu kullanabilirsiniz. Yönetici, yalnızca işlem yükseltilmiş şekilde çalışıyorsa ve kullanıcı gruptaysa Yöneticiler grubunun bir üyesi olacaktır. Süreç yükseltilmezse müdür grupta olmayacaktır.
Adam

1
Güzel cevap, kısa ve etkili, bunun için size +1 verdim. NB Bunu kodumda ( private bool IsAdmin{ get { ... } }) bir özellik yaptım , ardından çağırırsanız parantezlere ihtiyacınız olmaz IsAdmin.
Matt

4

Kullanmak TokenElevationTypeişe yarar, ancak PInvokeCheckTokenMembership() yönetici grubu karşı ederseniz, kodunuz UAC kapalı ve 2000 / XP / 2003 olduğunda da çalışır ve aynı zamanda reddetme SID'lerini de işler.

Ayrıca kontrolü sizin için IsUserAnAdmin()yapan bir işlev var CheckTokenMembership, ancak MSDN bunun sonsuza kadar orada olmayabileceğini söylüyor


UAC'ye tabi olduğunda CheckTokenMembership'i yetersiz buldum - github.com/chocolatey/choco/blob/… yanlış döndürüyor. Kodu kontrol (bunu yerine gidiyorum) ve Win2012R2 çıktı bakmak - i.imgur.com/gX3JP0W.png
ferventcoder

@ferventcoder Gerçekten ne bilmek istediğinize bağlıdır; kullanıcı şu anda yükseltilmiş bir yöneticidir veya gerekirse yükseltebilirler. Örneğin TOKEN_ELEVATION_TYPE'ı kontrol edebilir ve şunun gibi bir şey elde edebilirsiniz: bool is_or_can_elevate () {return process_is_elevated () || TokenElevationTypeLimited == get_current_token_elevation_type (); }. Diğer bir sorun da yükseltilmiş tanımının her yerde aynı olmamasıdır, "Yönetici:" önekine sahip bir konsol penceresine sahip olabilirsiniz ve aynı zamanda Yüksek bütünlük seviyesinin altında olabilirsiniz! TokenElevation her zaman TokenIntegrityLevel ile eşleşmez.
Anders

Eğlenceli zamanlar. Kullanıcının yönetici olup olmadığından ayrı olarak yükseltilmiş bir işlemim olup olmadığını bilmek istiyorum. İşte burada sona erdiğim yer. Yanlışsa nereye gitmem gerektiğini bana bildirin - github.com/chocolatey/choco/issues/77#issuecomment-73523774 ve github.com/chocolatey/choco/commit/…
ferventcoder

@ferventcoder is_processes_elevated () {dönüş CheckTokenMembership / IsInRole || TokenElevation / TokenIntegrityLevel> = 0x3000; } UAC kapalıyken <Vista ve Vista + için CheckTokenMembership veya IsInRole. TokenElevation veya TokenIntegrityLevel> = 0x3000, yüksekliği tam olarak nasıl algılamak istediğinize bağlı olarak. Conhost.exe'nin TokenElevation'ı kullandığına inanıyorum, ancak IMHO bozuk ve gerçek seviyeyi kontrol etmelisiniz ... (TokenElevation'ı kandıran bir simge oluşturmak için özel araçlara ihtiyacınız var) Ayrıca bkz: windowssucks.wordpress.com/2011/02/07 / uac-are-you-high / #
Anders

... ve bu biraz yanlış olsa bile, teoride yüksek bir token'a sahip olmak ve yöneticiler grubunda olmamak mümkündür. Dolayısıyla, yalnızca yöneticiler grubundaki kişileri istiyorsanız ve yükseltildiklerinden emin olursanız, CheckTokenMembership / IsInRole kontrolünü gerçekleştirmelisiniz ve ardından Token * kontrolü başarısız olmalıdır (UAC yok) veya değeri, yüksekliği göstermelidir ... gerçekte neye erişmek istediğiniz üzerine. Sistem / yönetici olmanız ve yükseltilmiş olmanız veya sadece yükseltilmiş olmanız gerekebilir, bu ACL'ye bağlıdır.
Anders

4

Bu Yanıtın birkaç sorunu var. İlk olarak, Yönetici olarak çalışan herhangi bir Sistem işlemi almaz (örneğin, NT Yetkilisi / SİSTEM altında). Aşağıdaki kod örneği tüm sorunları düzeltir (algılar, LocalAdmins, DomainAdmins ve LocalSystemAdmins)

Sadece mevcut Süreci istiyorsanız, pHandleşununla değiştirin:Process.GetCurrentProcess().Handle

NOT: Çalıştırmak için belirli ayrıcalıklara sahip olmanız gerekir. (Her Yönetici Süreci bunlara sahiptir ancak önce bunları etkinleştirmesi gerekir, Hizmetler varsayılan olarak etkinleştirir)

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

Sanırım bir sorun daha var. Sizin tarafınızdan sağlanan çözümleri kontrol ettim ve Windows 7 kurulumunda ve bir yönetici olarak oturum açtığımda kontrolün çalışmadığını söylemeliyim. Windows hiçbir zaman işlemin yükseltilmiş modda çalıştığı bilgisini döndürmez. Yani sıra:

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

Yönetici olarak oturum açıldığında true değerini döndürmez, ancak işlem, sistem işlemlerini gerçekleştirmek için tüm ayrıcalıklara sahiptir (örneğin, sistem hizmetlerini durdurma). Çalışma sırası şöyledir:

if (IsUserAdmin())
    return true;

if (IsUacEnabled)
    return IsProcessInElevatedMode();

return false;

Önce işlemin Yönetici bağlamında çalıştırılıp çalıştırılmadığını kontrol etmelisiniz. İlave bilgi:

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

Tüm bu yöntemler önceki yazılarda açıklanmıştır.


1
Bu bir cevap değil, muhtemelen başka bir
gönderiye yapılan

1

UACHelper nuget paketini kullanma : https://www.nuget.org/packages/UACHelper/

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

Kullanıcının gerçekten bir yönetici olup olmadığını veya işlemin UAC sanallaştırması altında çalışıp çalışmadığını veya masaüstü sahibinin işlem sahibi olup olmadığını tespit etmek için kullanılabilecek birçok başka özellik vardır. (Sınırlı hesaptan çalıştır)

Daha fazla bilgi için beni oku bölümüne bakın.


1

Bu kodu kullanıyorum ve iyi çalışıyor:


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

* Admin, Build-In Administrators grubunun bir parçasıdır.

"Sistem yöneticisi için bir kullanıcı hesabı. Bu hesap, işletim sistemi kurulumu sırasında oluşturulan ilk hesaptır. Hesap silinemez veya kilitlenemez. Yöneticiler grubunun bir üyesidir ve bu gruptan kaldırılamaz." - https://ss64.com/nt/syntax-security_groups.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.