Sie haben die Berechtigung, die jedoch deaktiviert ist . Das sagt Ihnen PowerShell.
Um das System herunterzufahren, verwenden Sie die aufgerufene Win32API-Funktion InitiateSystemShutdown
oder ExitWindowsEx
:
ExitWindowsEx(EWX_POWEROFF, 0);
Diese Funktionen beachten:
Um den lokalen Computer herunterzufahren, muss der aufrufende Thread die Berechtigung SE_SHUTDOWN_NAME besitzen. Standardmäßig können Benutzer das SE_SHUTDOWN_NAME- Privileg auf dem Computer aktivieren, auf dem sie angemeldet sind, und Administratoren können das SE_REMOTE_SHUTDOWN_NAME-Privileg auf Remotecomputern aktivieren.
Wie Sie sehen, überprüft Windows die Thread- Berechtigungen (jeder Thread hat ein Token mit Berechtigungen). Wenn Sie ExitWindowsEx
ohne die Berechtigung SE_SHUTDOWN_NAME aufrufen, schlägt die Funktion mit dem Fehler fehl:
Error code: 1314 A required privilege is not held by the client
Von Ihnen standardmäßig erstellte Threads erben Ihre Berechtigungen. Ein Programm kann jedoch ein deaktiviertes Privileg aktivieren, das mit AdjustTokenPrivileges
folgenden Berechtigungen erteilt wurde :
TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = LookupPrivilegeValue(NULL, "SeShutdownPrivilege"); tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; HANDLE processToken = OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES); AdjustTokenPrivileges(processToken, false, tp, 0, NULL, NULL); CloseHandle(processToken);
Das Ändern von Berechtigungen in einem Token lautet:
AdjustTokenPrivileges
Sie können dem Token keine Berechtigungen hinzufügen oder entfernen . Es können nur vorhandene Berechtigungen aktiviert werden, die derzeit deaktiviert sind, oder vorhandene Berechtigungen, die derzeit aktiviert sind
Warum ist dieses Privileg standardmäßig deaktiviert? Um sicherzustellen, dass kein Programm Windows versehentlich herunterfahren kann. Anwendungen sollten dies explizit verlangen.
Es gibt ein altes, aber sehr gutes Buch: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ über all das.