3

Windows 7 マシンを C# WPF アプリケーションから再起動しようとしています。この範囲で、次のコードを追加しました (列挙型を使用しましたが、コードを短くするために、ここに定数を挿入しています)。

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

public static void Reboot() {
    ExitWindowsEx(0x02, 0x0)
}

Windows 7マシンでは、これはまったく何もしません(とにかく私にとって)。0x2 (再起動) を 0x0 (ログオフ) に変更すると、コードは現在のユーザーをログオフしますが、再起動コードは機能していないようです。

GetLastError API 呼び出しを使用しても、あまり効果がありませんでした。関数が正常に完了したことについて何かを言っているだけです。

今のところ、/r /f を使用してシャットダウン コマンドを呼び出すことで対応していますが、アプリケーションから Windows API を直接呼び出すことができるようにしたいと考えています。

4

1 に答える 1

4

エラーを正しくチェックしていません。関数が false を返すかどうかのみを確認し、GetLastError() を pinvoke せ、代わりに Marshal.GetLastWin32Error() を使用します。最良の方法:

public static void Reboot() {
    if (!ExitWindowsEx(0x02, 0x0)) {
        throw new System.ComponentModel.Win32Exception();
    }
}

マシンを再起動するのに十分な権限がないことがわかる可能性が高くなります。AdjustTokenPrivileges が必要です。MSDN の記事を確認してください。

于 2012-06-22T14:52:58.730 に答える