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.

War es hilfreich?

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 das SE_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

#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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top