Wie PC über Windows-API deaktivieren?
-
19-09-2019 - |
Frage
I nie programmiert, um eine winapi so habe ich hier ein kleines Problem.
Ich brauche meinen PC aus meiner Anwendung deaktivieren.
Ich fand dieses Beispiel Linktext dann fand ich dieses Beispiel, wie Privilegien ändern Link-Text
Aber ich habe ein Problem, wie man diesen Parameter HANDLE hToken // Zugriffstoken handle
Ich glaube, ich es in der nächsten Bestellung vornehmen muß, um die Parameter zu erhalten Open LookupPrivilegeValue AdjustTokenPrivileges aber es gibt viele Parameter, die ich keine Ahnung, was mit ihnen zu tun.
Vielleicht haben Sie einige Beispiel Jere, wie ich, dass hToken Parameter Handle, um diese Arbeit zu machen.
übrigens sah ich schon den folgenden Beitrag Link-Text
Vielen Dank alle.
Lösung
Das ist ein bisschen viel für die Kommentare auf Daniels Antwort, also werde ich es hier setzen.
Es sieht aus wie Ihr Hauptproblem an diesem Punkt ist, dass Ihr Prozess läuft nicht mit den Privilegien ein Herunterfahren des Systems durchzuführen erforderlich.
Die Dokumentation für ExitWindowsEx diese enthalten Zeile:
Zum Herunterfahren oder das System neu starten, der aufrufende Prozess muss die Verwendung
AdjustTokenPrivileges
Funktion ermöglicht es dasSE_SHUTDOWN_NAME
Privileg. Weitere Informationen finden Sie unter Laufen mit Besondere Privilegien .
Sie haben auch einige Beispielcode . In einer Prise, können Sie das einfach kopieren.
Andere Tipps
// ==========================================================================
// system shutdown
// nSDType: 0 - Shutdown the system
// 1 - Shutdown the system and turn off the power (if supported)
// 2 - Shutdown the system and then restart the system
void SystemShutdown(UINT nSDType)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp ;
::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1 ; // set 1 privilege
tkp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;
// get the shutdown privilege for this process
::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
switch (nSDType)
{
case 0: ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0); break;
case 1: ::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0); break;
case 2: ::ExitWindowsEx(EWX_REBOOT |EWX_FORCE, 0); break;
}
}
könnten Sie ShellExecute () rufen Sie shutdown.exe
http://msdn.microsoft.com/ en-us / library / aa376868 (VS.85) aspx
Versuchen
ExitWindowsEx(EWX_POWEROFF, 0);
#include<iostream>
using namespace std;
int main(){
system("shutdown -s -f -t 0");
}
Einige Arbeits Code für InitiateSystemShutdownEx
:
// Get the process token
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken);
// Build a token privilege request object for shutdown
TOKEN_PRIVILEGES tk;
tk.PrivilegeCount = 1;
tk.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue(NULL, TEXT("SeShutdownPrivilege"), &tk.Privileges[0].Luid);
// Adjust privileges
AdjustTokenPrivileges(hToken, FALSE, &tk, 0, NULL, 0);
// Go ahead and shut down
InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, FALSE, 0);
So weit ich das beurteilen kann, ist der Vorteil hierbei über die ExitWindowsEx
Lösung, dass der anrufende Prozess nicht zu dem aktiven Benutzer angehören muss.