【问题标题】:ExitWindowsEx windows 7 shutdown does not workExitWindowsEx windows 7 关机不起作用
【发布时间】:2012-06-22 14:34:07
【问题描述】:

我正在尝试让 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,因此非常感谢任何帮助。

【问题讨论】:

    标签: winapi windows-7


    【解决方案1】:

    您没有正确检查错误。仅检查函数是否返回 false,not pinvoke GetLastError(),改用 Marshal.GetLastWin32Error()。最佳方式:

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

    您很可能会发现自己没有足够的权限来重新启动计算机。需要 AdjustTokenPrivileges,查看 MSDN 文章。

    【讨论】:

    • 我会在我回到办公室时看看这个。我在我自己的帐户信息下运行代码,这是一个域管理员。此外,我现在重写了 Reboot() 函数以调用外部 shutdown.exe 并带有 /r 标志(对于同一用户)。特权问题对我来说似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2012-06-13
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多