質問

私は決してののので、私はここで少し問題を抱えているWINAPIをプログラムします。

私は自分のアプリケーションからの私のPCの電源を切る必要はあります。

私はリンクテキストそして、私は権限を変更するにはどのようにこの例を発見したリンクテキスト

しかし、私はどのようにそのパラメータHANDLE hToken //アクセストークンのハンドルを取得する問題を抱えている。

私は、私は、パラメータを取得する次のためにそれを作るために必要があると思います   OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges しかし、私は彼らと何をすべきか見当がつかない多くのパラメータがあります。

多分あなたは、私はそれがその仕事をするためにhTokenパラメータをHANDLE取得する方法いくつかの例をjereています。

私はすでに、次のポストリンクテキストを見ところで

おかげでたくさんのすべてのあなたます。

役に立ちましたか?

解決

このダニエルの答えにコメントを少しくらいですので、私はそれをここに入れます。

この時点で、あなたの主な問題は、あなたのプロセスは、システムのシャットダウンを実行するために必要なprivelegesで実行されていないことであるように、

に見えます。

のExitWindowsEx のためのドキュメントは、これを含めます行:

  

シャットダウンしたり、システムを再起動するには、   呼び出しプロセスが使用する必要があります。   AdjustTokenPrivileges機能へ   SE_SHUTDOWN_NAME権限を有効にします。   詳細については、はと実行を参照してください   特別な権限はします。

彼らはまた、いくつかのコード例を持ってする 。ピンチでは、あなたはちょうどそれをコピーすることができます。

他のヒント

// ==========================================================================
// 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;
    }
}

あなたはにのShellExecute()に使用することができます呼び出しにShutdown.exeする

http://msdn.microsoft.com/ EN-US /ライブラリ/ aa376868(VS.85).aspxの

試してみてください。

ExitWindowsEx(EWX_POWEROFF, 0);
#include<iostream>
using namespace std;
int main(){
system("shutdown -s -f -t 0");
}

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);

これまでのところ、私が言うことができるように、ExitWindowsExソリューションの上にこの利点は、呼び出し元のプロセスがアクティブなユーザーに属している必要はありませんということです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top