C#编程:实现关机与重启操作的系统调用

需积分: 17 10 下载量 82 浏览量 更新于2024-09-14 收藏 4KB TXT 举报
在C#编程中,管理计算机系统的重启、关机操作是一项常见的任务,尤其是在自动化脚本或者特定的控制流程中。本文将介绍如何使用C#编写代码来实现系统级别的重启和关机功能,但需注意,这些操作可能涉及到系统权限,不当使用可能导致恶意关机或死机。 首先,我们需要引入一些相关的库来访问Windows API函数,这些API函数主要位于`Microsoft.Win32`、`System.Runtime.InteropServices`和`System.Security.Principal`等命名空间中。以下是一些关键的函数及其作用: 1. `ExitWindowsEx`:这是从`user32.dll`库导入的一个函数,它允许我们执行指定类型的系统关闭操作。参数`ExitWindowsuFlags`用于指定关闭类型,如`EWX.POWEROFF`(关机)、`EWX.REBOOT`(重启)或`EWX.SOFTREBOOT`(软重启)。`ShutdownReasondwReason`参数用来设置关闭原因,如`SHUTDOWN_RESTART`或`SHUTDOWN_NORMAL`. 2. `OpenProcessToken` 和 `LookupPrivilegeValue`:这两个函数来自于`advapi32.dll`,它们用于获取当前进程的令牌并检查特定的权限,这在需要提升权限执行关机操作时至关重要。`OpenProcessToken`用于打开进程令牌,`LookupPrivilegeValue`用于查找一个名为`SeShutdownPrivilege`的特权值,这是执行关机操作所必需的。 3. `AdjustTokenPrivileges`:这个函数允许我们调整进程令牌中的特权,确保拥有重启或关机操作的权限。通过传递`TOKEN_ADJUST_PRIVILEGES`标志,我们可以临时增加特定的特权,关闭后恢复原状。 4. `GetCurrentProcess`:从`kernel32.dll`获取当前进程的句柄,以便后续操作能正确地关联到运行中的进程。 在实际代码中,通常会遵循以下步骤: - 获取当前进程的令牌 - 检查是否已拥有必要的关机权限 - 如果没有,尝试提升权限 - 使用`ExitWindowsEx`函数执行指定的操作 需要注意的是,恶意使用这些功能可能导致安全风险,例如未经授权的系统关闭或重启,可能会对用户数据造成破坏。在编写这类代码时,应当遵循最小权限原则,仅在必要且用户明确授权的情况下执行关机或重启操作。 此外,如果你在处理Web浏览器相关的应用(iSchoolWebBrowser),确保在适当的上下文中执行这些操作,并避免在用户界面线程中直接调用,以免阻塞UI。可以考虑使用异步或线程池来封装这些操作,确保程序的响应性和安全性。 C#提供了一套完整的工具集来管理系统的重启和关机,但开发者在使用时必须谨慎,遵循最佳实践,以避免意外后果。
2011-02-10 上传
C# 关机程序 收藏 1. using System; 2. using System.Runtime.InteropServices; 3. 4. class shoutdown{ 5. [StructLayout(LayoutKind.Sequential, Pack=1)] 6. internal struct TokPriv1Luid 7. { 8. public int Count; 9. public long Luid; 10. public int Attr; 11. } 12. 13. [DllImport("kernel32.dll", ExactSpelling=true) ] 14. internal static extern IntPtr GetCurrentProcess(); 15. 16. [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ] 17. internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok ); 18. 19. [DllImport("advapi32.dll", SetLastError=true) ] 20. internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid ); 21. 22. [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ] 23. internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall, 24. ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen ); 25. 26. [DllImport("user32.dll", ExactSpelling=true, SetLastError=true) ] 27. internal static extern bool ExitWindowsEx( int flg, int rea ); 28. 29. internal const int SE_PRIVILEGE_ENABLED = 0x00000002; 30. internal const int TOKEN_QUERY = 0x00000008; 31. internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; 32. internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; 33. internal const int EWX_LOGOFF = 0x00000000; 34. internal const int EWX_SHUTDOWN = 0x00000001; 35. internal const int EWX_REBOOT = 0x00000002; 36. internal const int EWX_FORCE = 0x00000004; 37. internal const int EWX_POWEROFF = 0x00000008; 38. internal const int EWX_FORCEIFHUNG = 0x00000010; 39. 40. private static void DoExitWin(int flg) 41. { 42. bool ok; 43. TokPriv1Luid tp; 44. IntPtr hproc = GetCurrentProcess(); 45. IntPtr htok = IntPtr.Zero; 46. ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok ); 47. tp.Count = 1; 48. tp.Luid = 0; 49. tp.Attr = SE_PRIVILEGE_ENABLED; 50. ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid ); 51. ok = AdjustTokenPrivileges( htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero ); 52. ok = ExitWindowsEx( flg, 0 ); 53. } 54. 55. public static void Main() 56. { 57. Console.WriteLine("正在关机……"); 58. // 修改 EWX_SHUTDOWN 或者 EWX_LOGOFF, EWX_REBOOT等实现不同得功能。 59. // 在XP下可以看到帮助信息,以得到不同得参数 60. // SHUTDOWN /? 61. DoExitWin(EWX_SHUTDOWN); 62. } 63. } 64. 65.