Probieren Sie es aus:
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;
}
}
}
}
Marshal.SizeOf((int)elevationResult)
ich mir noch nicht sicher bin warum. Ausnahmemeldung ist: Methode nicht gefunden. Um:Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
(neue Antwort sechs Jahre nach der Frage)
Haftungsausschluss: Dies ist nur etwas, das auf meinem speziellen Betriebssystem mit meinen speziellen Einstellungen mit meinem bestimmten Benutzer funktioniert hat:
using System.Security.Principal; // ... static bool IsElevated { get { return WindowsIdentity.GetCurrent().Owner .IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid); } }
Wenn ich also "Als Administrator ausführen" ausführe,
get
kehrt der Eigenschaftenzugriff zurücktrue
. Bei normaler Ausführung (auch wenn mein Benutzer "Administrator" ist und diese bestimmte Anwendung nicht "als Administrator" ausführt) wird sie zurückgegebenfalse
.Dies scheint viel einfacher als viele andere Antworten.
Ich habe keine Ahnung, ob es Fälle gibt, in denen dies fehlschlägt.
PS! Dies scheint auch in Ordnung zu sein:
static bool IsElevated { get { var id = WindowsIdentity.GetCurrent(); return id.Owner != id.User; } }
quelle
IsElevated
false zurückgegeben wird, der Prozess wird jedoch möglicherweise weiterhin mit einer hohen Integritätsstufe ausgeführt. Ein wirklich nicht erhöhter Prozess hat ein mittleres Integritätsniveau. Dies ist wahrscheinlich für 99% der Anwendungen irrelevant, aber es ist erwähnenswert, da Tools wie Process Hacker einen solchen Prozess möglicherweise immer noch als erhöht deklarieren. Ein "halb unbeaufsichtigter" Prozess ist etwas, das Sie normalerweise nicht sehen würden. Dies kann auftreten, wenn jemand einen nicht erhöhten untergeordneten Prozess nicht korrekt startet.Hier ist eine modifizierte Version dieser Antwort , die Dinge wie die ordnungsgemäße Entsorgung von Ressourcen und den Umgang mit Domänenadministratoren enthält.
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; } } } }
quelle
Marshal.SizeOf((int)elevationResult)
ich mir noch nicht sicher bin warum. Ausnahmemeldung ist: Methode nicht gefunden. Um:Int32 System.Runtime.InteropServices.Marshal.SizeOf(!!0).
Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE))
,int elevationResultSize = Marshal.SizeOf(typeof(TOKEN_ELEVATION_TYPE))
eineArgumentException
32-Bit-Anwendung .NET 4.0 aus, die jedochint elevationResultSize = Marshal.SizeOf((int)elevationResult)
funktioniert hat.Der UAChelper des CodePlex-Projekts verfügt über Code, der die Höhe in UserAccountControl.cpp
UserAccountControl::IsUserAdmin
überprüft, prüft, ob die Benutzerkontensteuerung aktiviert ist, und dann prüft, ob der Prozess erhöht ist.bool UserAccountControl::IsCurrentProcessElevated::get() { return GetProcessTokenElevationType() == TokenElevationTypeFull; //elevated }
von der Funktion:
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); } }
quelle
In .net Framwork 4.5 habe ich eine andere Methode gefunden, die für mich funktioniert. In Bezug auf das folgende Skript , die hier gefunden werden kann hier (in deutscher Sprache)
rem --- Admintest.bat --- whoami /groups | find "S-1-5-32-544" > nul if errorlevel 1 goto ende echo Benutzer %username% ist lokaler Administrator. :ende
In C # sieht es so aus:
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; } }
Aber in .net <4.5 enthält die
WindowsPrincipal
Klasse dieUserClaims
Eigenschaft nicht und ich habe keine Möglichkeit gefunden, diese Informationen abzurufen.quelle
private bool IsAdmin{ get { ... } }
) gemacht, dann brauchen Sie die Klammern nicht, wenn Sie aufrufenIsAdmin
.Die Verwendung
TokenElevationType
würde funktionieren, aber wenn Sie PInvokeCheckTokenMembership()
gegen die SID der Administratorgruppe durchführen, funktioniert Ihr Code auch , wenn die Benutzerkontensteuerung deaktiviert ist und 2000 / XP / 2003 aktiviert ist, und behandelt auch die Verweigerung von SIDs.Es gibt auch eine
IsUserAnAdmin()
Funktion, die dieCheckTokenMembership
Prüfung für Sie durchführt, aber MSDN sagt, dass sie möglicherweise nicht für immer da istquelle
Diese Antwort hat einige Probleme. Erstens werden keine Systemprozesse abgerufen, die als Administrator ausgeführt werden (z. B. unter NT-Authority / SYSTEM). Das folgende Codebeispiel behebt alle Probleme (erkennt, LocalAdmins, DomainAdmins und LocalSystemAdmins)
Wenn Sie nur den aktuellen Prozess möchten, ersetzen Sie ihn
pHandle
durchProcess.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; }
quelle
Ich denke, es gibt noch ein Problem. Ich habe die von Ihnen bereitgestellten Lösungen überprüft und muss sagen, dass bei der Installation von Windows 7 und der Anmeldung als Administrator die Überprüfung nicht funktioniert. Windows gibt niemals Informationen zurück, die der Prozess in einem erhöhten Modus ausführt. Also die Reihenfolge:
if (IsUacEnabled) return IsProcessInElevatedMode(); return IsUserAdmin();
Gibt nicht true zurück, wenn Sie als Administrator angemeldet sind, aber der Prozess verfügt über alle Berechtigungen zum Ausführen von Systemvorgängen (z. B. Stoppen von Systemdiensten). Die Arbeitssequenz ist:
if (IsUserAdmin()) return true; if (IsUacEnabled) return IsProcessInElevatedMode(); return false;
Sie sollten zunächst überprüfen, ob der Prozess im Administratorkontext ausgeführt wird. Zusätzliche Information:
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
All diese Methoden wurden in früheren Beiträgen beschrieben.
quelle
Verwenden des UACHelper- Nuget-Pakets: https://www.nuget.org/packages/UACHelper/
if (UACHelper.IsElevated) // something else // something else
Es gibt viele andere Eigenschaften, mit denen festgestellt werden kann, ob der Benutzer tatsächlich ein Administrator ist, ob der Prozess unter UAC-Virtualisierung ausgeführt wird oder ob der Desktop-Eigentümer der Prozess-Eigentümer ist. (Ausgehend von einem begrenzten Konto ausführen)
Weitere Informationen finden Sie unter Lesen Sie mich.
quelle