2012-06-22 111 views
3

我想让Windows 7机器从C#WPF应用程序重新启动。在这个意义上我已经添加以下代码(我用了一个枚举,但要保持代码的短,我只是将这里的常量):ExitWindowsEx Windows 7关机不起作用

[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调用也没有太大作用。它只是说了一些有关该功能已成功完成的内容。

现在我只是通过调用shutdown命令来应对/ r/f,但我更喜欢能够从我的应用程序直接调用Windows API,所以任何帮助将不胜感激。

回答

4

您没有正确检查错误。只检查函数是否返回false,做而不是 pinvoke GetLastError(),改用Marshal.GetLastWin32Error()。最好的办法:

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

以高赔率,你会发现,你没有足够的权限来重启机器。需要AdjustTokenPrivileges,请查看MSDN文章。

+0

当我回到办公室时,我会看看这个。我在自己的帐户信息下运行该代码,但这是一个域管理员。另外,我现在重写了Reboot()函数,以使用/ r标志调用外部shutdown.exe,它可以工作(对于同一个用户)。特权问题对我来说似乎很奇怪。 – Robba

相关问题