Heim >Backend-Entwicklung >C++ >Wie erkennt man zuverlässig Administrator- und erhöhte Rechte in Windows?

Wie erkennt man zuverlässig Administrator- und erhöhte Rechte in Windows?

DDD
DDDOriginal
2025-01-13 08:44:42609Durchsuche

How to Reliably Detect Administrator and Elevated Privileges in Windows?

So erkennen Sie Administratorrechte mit oder ohne erhöhte Berechtigungen

Ihr aktueller Code identifiziert erfolgreich den Administratorstatus, schlägt jedoch bei der Bestimmung erhöhter Berechtigungen fehl. Um dieses Problem umfassend anzugehen, werden wir einen anderen Ansatz untersuchen.

Überprüfen Sie, ob UAC aktiviert ist

Stellen Sie zunächst sicher, dass die Benutzerkontensteuerung (UAC) aktiviert ist. UAC ist eine Sicherheitsfunktion, die unbefugte Änderungen am Betriebssystem einschränkt. Wenn UAC aktiviert ist, benötigen wir einen anderen Ansatz für die Prüfung auf erhöhte Berechtigungen.

<code>RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false);
bool isUacEnabled = uacKey.GetValue(uacRegistryValue).Equals(1);</code>

Erhöhte Berechtigungen für den Prozess bestätigen

Als nächstes überprüfen wir den Status der erhöhten Berechtigung des aktuellen Prozesses. Wenn UAC aktiviert ist, verwenden wir die Funktion GetTokenInformation, um den Token-Promotion-Typ abzurufen.

<code>IntPtr tokenHandle;
if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
{throw new ApplicationException("无法获取进程令牌。Win32 错误代码: " + 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;
}</code>

Wenn UAC nicht aktiviert ist, können wir uns darauf verlassen, WindowsPrincipal.IsInRole den Aktionsstatus zu überprüfen.

<code>WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool result = principal.IsInRole(WindowsBuiltInRole.Administrator);
return result;</code>

Komplettlösung

Durch die Kombination dieser beiden Methoden können wir unabhängig vom UAC-Status umfassend erkennen, ob eine Anwendung mit erhöhten Rechten ausgeführt wird.

Das obige ist der detaillierte Inhalt vonWie erkennt man zuverlässig Administrator- und erhöhte Rechte in Windows?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn