频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

使用C#编写的一个定时关机程序

作者: 出处:中国IT实验室  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2006-11-02 14:15
关 键 词:C#  定时  关机  程序
阅读提示:本文给出了使用C#编写的实现关机,重启,注销等功能的源代码。

有很多的软件都实现了自动关机这样的功能。前一阵在Codeproject上看到一个这样的程序,整理了一下共享给大家。里面实现了关机,重启,注销等功能。

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;

namespace TimerComputerShutdown
{
/// <summary>
/// Summary description for TimerComputerShutdown.
/// </summary>
public class TimerComputerShutdown : System.Windows.Forms.Form
{
private System.Windows.Forms.Label labelWhatDoYouWantTheComputerToDo;
private System.Windows.Forms.ComboBox comboBox;
private System.Windows.Forms.Label labelSelectDateTimeToShutdownComputer;
private System.Windows.Forms.DateTimePicker dateTimePicker;
private System.Windows.Forms.Label labelDateTimeNow;
private System.Windows.Forms.Label labelDateTimeShutdown;
private System.Windows.Forms.Label labelNow;
private System.Windows.Forms.Label labelShutdown;
private System.Windows.Forms.Panel panelParent;
private System.Windows.Forms.Panel panelChild;
private System.Windows.Forms.CheckBox checkBox;
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.Button buttonInvoke;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

private System.Threading.ThreadStart threadStart;
private System.Threading.Thread thread;

[DllImport("user32.dll")] private static extern
bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")] private static extern
bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")] private static extern
bool IsIconic(IntPtr hWnd);

private const int SW_HIDE = 0;
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_SHOWNOACTIVATE = 4;
private const int SW_RESTORE = 9;
private const int SW_SHOWDEFAULT = 10;

public TimerComputerShutdown()
{  
InitializeComponent();
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager

(typeof

(TimerComputerShutdown));
this.labelWhatDoYouWantTheComputerToDo = new System.Windows.Forms.Label();
this.comboBox = new System.Windows.Forms.ComboBox();
this.labelSelectDateTimeToShutdownComputer = new System.Windows.Forms.Label();
this.dateTimePicker = new System.Windows.Forms.DateTimePicker();
this.labelDateTimeNow = new System.Windows.Forms.Label();
this.labelDateTimeShutdown = new System.Windows.Forms.Label();
this.labelNow = new System.Windows.Forms.Label();
this.labelShutdown = new System.Windows.Forms.Label();
this.panelParent = new System.Windows.Forms.Panel();
this.panelChild = new System.Windows.Forms.Panel();
this.buttonCancel = new System.Windows.Forms.Button();
this.buttonInvoke = new System.Windows.Forms.Button();
this.checkBox = new System.Windows.Forms.CheckBox();
this.panelParent.SuspendLayout();
this.panelChild.SuspendLayout();
this.SuspendLayout();
//
// labelWhatDoYouWantTheComputerToDo
//
this.labelWhatDoYouWantTheComputerToDo.Location = new System.Drawing.Point(8, 8);
this.labelWhatDoYouWantTheComputerToDo.Name = "labelWhatDoYouWantTheComputerToDo";
this.labelWhatDoYouWantTheComputerToDo.Size = new System.Drawing.Size(216, 16);
this.labelWhatDoYouWantTheComputerToDo.TabIndex = 9;
this.labelWhatDoYouWantTheComputerToDo.Text = "选择任务:";
this.labelWhatDoYouWantTheComputerToDo.TextAlign =

System.Drawing.ContentAlignment.MiddleLeft;
//
// comboBox
//
this.comboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBox.Items.AddRange(new object[] {
"关机",
"重启",
"待机",
"睡眠",
"注销"});
this.comboBox.Location = new System.Drawing.Point(184, 8);
this.comboBox.Name = "comboBox";
this.comboBox.Size = new System.Drawing.Size(112, 21);
this.comboBox.TabIndex = 0;
this.comboBox.SelectedIndexChanged += new System.EventHandler

(this.comboBox_SelectedIndexChanged);
//
// labelSelectDateTimeToShutdownComputer
//
this.labelSelectDateTimeToShutdownComputer.Location = new System.Drawing.Point(8, 32);
this.labelSelectDateTimeToShutdownComputer.Name =

"labelSelectDateTimeToShutdownComputer";
this.labelSelectDateTimeToShutdownComputer.Size = new System.Drawing.Size(144, 16);
this.labelSelectDateTimeToShutdownComputer.TabIndex = 7;
this.labelSelectDateTimeToShutdownComputer.Text = "选择任务时间: ";
this.labelSelectDateTimeToShutdownComputer.TextAlign =

System.Drawing.ContentAlignment.MiddleLeft;
//
// dateTimePicker
//

this.dateTimePicker.CalendarFont = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.dateTimePicker.Cursor = System.Windows.Forms.Cursors.Arrow;
this.dateTimePicker.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.dateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Time;
this.dateTimePicker.Location = new System.Drawing.Point(184, 32);
this.dateTimePicker.Name = "dateTimePicker";
this.dateTimePicker.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.dateTimePicker.Size = new System.Drawing.Size(112, 21);
this.dateTimePicker.TabIndex = 1;
this.dateTimePicker.Value = new System.DateTime(2002, 9, 27, 0, 0, 0, 0);
this.dateTimePicker.ValueChanged += new System.EventHandler

(this.dateTimePicker_ValueChanged);
//
// labelDateTimeNow
//
this.labelDateTimeNow.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.labelDateTimeNow.Location = new System.Drawing.Point(8, 8);
this.labelDateTimeNow.Name = "labelDateTimeNow";
this.labelDateTimeNow.Size = new System.Drawing.Size(120, 16);
this.labelDateTimeNow.TabIndex = 4;
this.labelDateTimeNow.Text = "当前时间:";
this.labelDateTimeNow.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelDateTimeShutdown
//
this.labelDateTimeShutdown.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.labelDateTimeShutdown.Location = new System.Drawing.Point(8, 32);
this.labelDateTimeShutdown.Name = "labelDateTimeShutdown";
this.labelDateTimeShutdown.Size = new System.Drawing.Size(120, 16);
this.labelDateTimeShutdown.TabIndex = 5;
this.labelDateTimeShutdown.Text = "任务时间:";
this.labelDateTimeShutdown.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelNow
//
this.labelNow.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.labelNow.ForeColor = System.Drawing.SystemColors.ControlText;
this.labelNow.Location = new System.Drawing.Point(136, 8);
this.labelNow.Name = "labelNow";
this.labelNow.Size = new System.Drawing.Size(136, 16);
this.labelNow.TabIndex = 1;
this.labelNow.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// labelShutdown
//
this.labelShutdown.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.labelShutdown.ForeColor = System.Drawing.SystemColors.ControlText;
this.labelShutdown.Location = new System.Drawing.Point(136, 32);
this.labelShutdown.Name = "labelShutdown";
this.labelShutdown.Size = new System.Drawing.Size(136, 16);
this.labelShutdown.TabIndex = 8;
this.labelShutdown.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// panelParent
//
this.panelParent.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panelParent.Controls.Add(this.panelChild);
this.panelParent.Location = new System.Drawing.Point(8, 60);
this.panelParent.Name = "panelParent";
this.panelParent.Size = new System.Drawing.Size(288, 60);
this.panelParent.TabIndex = 6;
//
// panelChild
//
this.panelChild.Controls.Add(this.labelNow);
this.panelChild.Controls.Add(this.labelShutdown);
this.panelChild.Controls.Add(this.labelDateTimeShutdown);
this.panelChild.Controls.Add(this.labelDateTimeNow);
this.panelChild.Location = new System.Drawing.Point(0, 0);
this.panelChild.Name = "panelChild";
this.panelChild.Size = new System.Drawing.Size(280, 56);
this.panelChild.TabIndex = 8;
//
// buttonCancel
//
this.buttonCancel.Cursor = System.Windows.Forms.Cursors.Hand;
this.buttonCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonCancel.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.buttonCancel.Location = new System.Drawing.Point(176, 128);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(56, 23);
this.buttonCancel.TabIndex = 4;
this.buttonCancel.Text = "取消&C";
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
//
// buttonInvoke
//
this.buttonInvoke.Cursor = System.Windows.Forms.Cursors.Hand;
this.buttonInvoke.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonInvoke.Font = new System.Drawing.Font("Tahoma", 8.25F,

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.buttonInvoke.Location = new System.Drawing.Point(240, 128);
this.buttonInvoke.Name = "buttonInvoke";
this.buttonInvoke.Size = new System.Drawing.Size(56, 23);
this.buttonInvoke.TabIndex = 3;
this.buttonInvoke.Text = "确定&O";
this.buttonInvoke.Click += new System.EventHandler(this.buttonInvoke_Click);
//
// checkBox
//
this.checkBox.Cursor = System.Windows.Forms.Cursors.Hand;
this.checkBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.checkBox.Location = new System.Drawing.Point(8, 128);
this.checkBox.Name = "checkBox";
this.checkBox.Size = new System.Drawing.Size(66, 24);
this.checkBox.TabIndex = 2;
this.checkBox.Text = "强制&B";
//
// TimerComputerShutdown
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 14);
this.BackColor = System.Drawing.Color.GhostWhite;
this.ClientSize = new System.Drawing.Size(306, 159);
this.Controls.Add(this.checkBox);
this.Controls.Add(this.comboBox);
this.Controls.Add(this.labelWhatDoYouWantTheComputerToDo);
this.Controls.Add(this.panelParent);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonInvoke);
this.Controls.Add(this.dateTimePicker);
this.Controls.Add(this.labelSelectDateTimeToShutdownComputer);
this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular,

System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "TimerComputerShutdown";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Timer Computer Shutdown";
this.TopMost = true;
this.Load += new System.EventHandler(this.TimerComputerShutdown_Load);
this.panelParent.ResumeLayout(false);
this.panelChild.ResumeLayout(false);
this.ResumeLayout(false);
}

#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new TimerComputerShutdown());
}

private void TimerComputerShutdown_Load(object sender, System.EventArgs e)
{
this.threadStart = new System.Threading.ThreadStart(Application_Tick);
this.thread = new System.Threading.Thread(threadStart);

this.panelChild.Visible = false;

this.dateTimePicker.Value = System.DateTime.Now;
}

protected override void OnClosing(CancelEventArgs e)
{
try
{
if (this.thread.IsAlive)
{
this.thread.Abort();
this.thread.Join();
}
}
catch (System.Threading.ThreadAbortException threadAbortException)
{
System.Threading.Thread.ResetAbort();
}
catch (System.Exception exception)
{
}
finally
{
System.Windows.Forms.Application.Exit();
}

base.OnClosing(e);
}

public void Computer_Shutdown()
{
if (this.checkBox.Checked)
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();

foreach (System.Diagnostics.Process processParent in processes)
{
System.Diagnostics.Process[] processNames =

System.Diagnostics.Process.GetProcessesByName(processParent.ProcessName);

foreach (System.Diagnostics.Process processChild in processNames)
{
try
{
System.IntPtr hWnd = processChild.MainWindowHandle;

if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, SW_RESTORE);
}

SetForegroundWindow(hWnd);

if (!(processChild.MainWindowTitle.Equals(this.Text)))
{
processChild.CloseMainWindow();
processChild.Kill();
processChild.WaitForExit();
}
}
catch (System.Exception exception)
{

}
}
}
}

System.Windows.Forms.Application.Exit();

switch (this.comboBox.SelectedIndex)
{
case 0:
WindowsController.ExitWindows(RestartOptions.PowerOff, false);
break;
case 1:
WindowsController.ExitWindows(RestartOptions.Reboot, false);
break;
case 2:
WindowsController.ExitWindows(RestartOptions.Suspend, false);
break;
case 3:
WindowsController.ExitWindows(RestartOptions.Hibernate, false);
break;
case 4:
WindowsController.ExitWindows(RestartOptions.LogOff, false);
break;
}
}

private void comboBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.labelSelectDateTimeToShutdownComputer.Text = "选择任务" + " " +

this.comboBox.SelectedItem.ToString() + " " + "时间:";
this.labelDateTimeShutdown.Text = "任务时间" + " " +

this.comboBox.SelectedItem.ToString

() + ":";
}
public bool dateTimePicker_Validated()
{
if (this.dateTimePicker.Value.CompareTo(System.DateTime.Now) < 0)
{
Error error = new Error();
error.ShowDialog();

this.dateTimePicker.Value = System.DateTime.Now;

return false;
}
else
{
return true;
}
}

private void dateTimePicker_ValueChanged(object sender, System.EventArgs e)
{
this.labelShutdown.Text = this.dateTimePicker.Value.ToString();
}

public void Application_Tick()
{
while (!(this.labelNow.Text.ToString().Equals(this.dateTimePicker.Value.ToString())))
{
this.labelNow.Text = System.DateTime.Now.ToString();
}

this.Computer_Shutdown();
}

private void buttonCancel_Click(object sender, System.EventArgs e)
{
try
{
if (this.thread.IsAlive)
{
this.thread.Abort();
this.thread.Join();
}
}
catch (System.Threading.ThreadStateException threadStateException)
{
System.Threading.Thread.ResetAbort();
}
catch (System.Exception exception)
{

}
finally
{
System.Windows.Forms.Application.Exit();
}
}
private void buttonInvoke_Click(object sender, System.EventArgs e)
{
if (this.dateTimePicker_Validated())
{
this.thread.Start();

this.comboBox.Enabled = false;
this.dateTimePicker.Enabled = false;
this.panelChild.Visible = true;
this.buttonInvoke.Enabled = false;
}
}
}
}

using System;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace TimerComputerShutdown{
/// <summary>
/// Specifies the type of restart options that an application can use.
/// </summary>
public enum RestartOptions {
/// <summary>
/// Shuts down all processes running in the security context of the process that called

the ExitWindowsEx function. Then it logs the user off.
/// </summary>
LogOff = 0,
/// <summary>
/// Shuts down the system and turns off the power. The system must support the power-off

feature.
/// </summary>
PowerOff = 8,
/// <summary>
/// Shuts down the system and then restarts the system.
/// </summary>
Reboot = 2,
/// <summary>
/// Shuts down the system to a point at which it is safe to turn off the power. All file

buffers have been flushed to disk, and all running processes have stopped. If the system

supports the power-off feature, the power is also turned off.
/// </summary>
ShutDown = 1,
/// <summary>
/// Suspends the system.
/// </summary>
Suspend = -1,
/// <summary>
/// Hibernates the system.
/// </summary>
Hibernate = -2,
}
/// <summary>
/// An LUID is a 64-bit value guaranteed to be unique only on the system on which it was

generated. The uniqueness of a locally unique identifier (LUID) is guaranteed only until the

system is restarted.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack=1)]
internal struct LUID {
/// <summary>
/// The low order part of the 64 bit value.
/// </summary>
public int LowPart;
/// <summary>
/// The high order part of the 64 bit value.
/// </summary>
public int HighPart;
}
/// <summary>
/// The LUID_AND_ATTRIBUTES structure represents a locally unique identifier (LUID) and its

attributes.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack=1)]
internal struct LUID_AND_ATTRIBUTES {
/// <summary>
/// Specifies an LUID value.
/// </summary>
public LUID pLuid;
/// <summary>
/// Specifies attributes of the LUID. This value contains up to 32 one-bit flags. Its

meaning is dependent on the definition and use of the LUID.
/// </summary>
public int Attributes;
}
/// <summary>
/// The TOKEN_PRIVILEGES structure contains information about a set of privileges for an

access token.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack=1)]
internal struct TOKEN_PRIVILEGES {
/// <summary>
/// Specifies the number of entries in the Privileges array.
/// </summary>
public int PrivilegeCount ;
/// <summary>
/// Specifies an array of LUID_AND_ATTRIBUTES structures. Each structure contains the LUID

and attributes of a privilege.
/// </summary>
public LUID_AND_ATTRIBUTES Privileges ;
}
/// <summary>
/// Implements methods to exit Windows.
/// </summary>
public class WindowsController {
/// <summary>Required to enable or disable the privileges in an access token.</summary>
private const int TOKEN_ADJUST_PRIVILEGES = 0x20;
/// <summary>Required to query an access token.</summary>
private const int TOKEN_QUERY = 0x8;
/// <summary>The privilege is enabled.</summary>
private const int SE_PRIVILEGE_ENABLED = 0x2;
/// <summary>Specifies that the function should search the system message-table resource

(s) for the requested message.</summary>
private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
/// <summary>Forces processes to terminate. When this flag is set, the system does not

send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to

lose data. Therefore, you should only use this flag in an emergency.</summary>
private const int EWX_FORCE = 4;
/// <summary>
/// The LoadLibrary function maps the specified executable module into the address space

of the calling process.
/// </summary>
/// <param name="lpLibFileName">Pointer to a null-terminated string that names the

executable module (either a .dll or .exe file). The name specified is the file name of the

module and is not related to the name stored in the library module itself, as specified by

the LIBRARY keyword in the module-definition (.def) file.</param>
/// <returns>If the function succeeds, the return value is a handle to the

module.<br></br><br>If the function fails, the return value is NULL. To get extended error

information, call Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "kernel32.dll", EntryPoint="LoadLibraryA", CharSet=CharSet.Ansi )]
private static extern IntPtr LoadLibrary(string lpLibFileName);
/// <summary>
/// The FreeLibrary function decrements the reference count of the loaded dynamic-link

library (DLL). When the reference count reaches zero, the module is unmapped from the

address space of the calling process and the handle is no longer valid.
/// </summary>
/// <param name="hLibModule">Handle to the loaded DLL module. The LoadLibrary or

GetModuleHandle function returns this handle.</param>
/// <returns>If the function succeeds, the return value is nonzero.<br></br><br>If the

function fails, the return value is zero. To get extended error information, call

Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "kernel32.dll", EntryPoint="FreeLibrary", CharSet=CharSet.Ansi )]
private static extern int FreeLibrary(IntPtr hLibModule);

/// <summary>
/// The GetProcAddress function retrieves the address of an exported function or variable

from the specified dynamic-link library (DLL).
/// </summary>
/// <param name="hModule">Handle to the DLL module that contains the function or variable.

The LoadLibrary or GetModuleHandle function returns this handle.</param>
/// <param name="lpProcName">Pointer to a null-terminated string containing the function

or variable name, or the function's ordinal value. If this parameter is an ordinal value, it

must be in the low-order word; the high-order word must be zero.</param>
/// <returns>If the function succeeds, the return value is the address of the exported

function or variable.<br></br><br>If the function fails, the return value is NULL. To get

extended error information, call Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "kernel32.dll", EntryPoint="GetProcAddress", CharSet=CharSet.Ansi )]
private static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
/// <summary>
/// The SetSuspendState function suspends the system by shutting power down. Depending on

the Hibernate parameter, the system either enters a suspend (sleep) state or hibernation

(S4). If the ForceFlag parameter is TRUE, the system suspends operation immediately; if it

is FALSE, the system requests permission from all applications and device drivers before

doing so.
/// </summary>
/// <param name="Hibernate">Specifies the state of the system. If TRUE, the system

hibernates. If FALSE, the system is suspended.</param>
/// <param name="ForceCritical">Forced suspension. If TRUE, the function broadcasts a

PBT_APMSUSPEND event to each application and driver, then immediately suspends operation. If

FALSE, the function broadcasts a PBT_APMQUERYSUSPEND event to each application to request

permission to suspend operation.</param>
/// <param name="DisableWakeEvent">If TRUE, the system disables all wake events. If FALSE,

any system wake events remain enabled.</param>
/// <returns>If the function succeeds, the return value is nonzero.<br></br><br>If the

function fails, the return value is zero. To get extended error information, call

Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "powrprof.dll", EntryPoint="SetSuspendState", CharSet=CharSet.Ansi )]
private static extern int SetSuspendState(int Hibernate, int ForceCritical, int

DisableWakeEvent);
/// <summary>
/// The OpenProcessToken function opens the access token associated with a process.
/// </summary>
/// <param name="ProcessHandle">Handle to the process whose access token is

opened.</param>
/// <param name="DesiredAccess">Specifies an access mask that specifies the requested

types of access to the access token. These requested access types are compared with the

token's discretionary access-control list (DACL) to determine which accesses are granted or

denied.</param>
/// <param name="TokenHandle">Pointer to a handle identifying the newly-opened access

token when the function returns.</param>
/// <returns>If the function succeeds, the return value is nonzero.<br></br><br>If the

function fails, the return value is zero. To get extended error information, call

Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "advapi32.dll", EntryPoint="OpenProcessToken", CharSet=CharSet.Ansi )]
private static extern int OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, ref

IntPtr TokenHandle);
/// <summary>
/// The LookupPrivilegeValue function retrieves the locally unique identifier (LUID) used

on a specified system to locally represent the specified privilege name.
/// </summary>
/// <param name="lpSystemName">Pointer to a null-terminated string specifying the name of

the system on which the privilege name is looked up. If a null string is specified, the

function attempts to find the privilege name on the local system.</param>
/// <param name="lpName">Pointer to a null-terminated string that specifies the name of

the privilege, as defined in the Winnt.h header file. For example, this parameter could

specify the constant SE_SECURITY_NAME, or its corresponding string,

"SeSecurityPrivilege".</param>
/// <param name="lpLuid">Pointer to a variable that receives the locally unique identifier

by which the privilege is known on the system, specified by the lpSystemName

parameter.</param>
/// <returns>If the function succeeds, the return value is nonzero.<br></br><br>If the

function fails, the return value is zero. To get extended error information, call

Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "advapi32.dll", EntryPoint="LookupPrivilegeValueA", CharSet=CharSet.Ansi )]
private static extern int LookupPrivilegeValue(string lpSystemName, string lpName, ref

LUID lpLuid);
/// <summary>
/// The AdjustTokenPrivileges function enables or disables privileges in the specified

access token. Enabling or disabling privileges in an access token requires

TOKEN_ADJUST_PRIVILEGES access.
/// </summary>
/// <param name="TokenHandle">Handle to the access token that contains the privileges to

be modified. The handle must have TOKEN_ADJUST_PRIVILEGES access to the token. If the

PreviousState parameter is not NULL, the handle must also have TOKEN_QUERY access.</param>
/// <param name="DisableAllPrivileges">Specifies whether the function disables all of the

token's privileges. If this value is TRUE, the function disables all privileges and ignores

the NewState parameter. If it is FALSE, the function modifies privileges based on the

information pointed to by the NewState parameter.</param>
/// <param name="NewState">Pointer to a TOKEN_PRIVILEGES structure that specifies an array

of privileges and their attributes. If the DisableAllPrivileges parameter is FALSE,

AdjustTokenPrivileges enables or disables these privileges for the token. If you set the

SE_PRIVILEGE_ENABLED attribute for a privilege, the function enables that privilege;

otherwise, it disables the privilege. If DisableAllPrivileges is TRUE, the function ignores

this parameter.</param>
/// <param name="BufferLength">Specifies the size, in bytes, of the buffer pointed to by

the PreviousState parameter. This parameter can be zero if the PreviousState parameter is

NULL.</param>
/// <param name="PreviousState">Pointer to a buffer that the function fills with a

TOKEN_PRIVILEGES structure that contains the previous state of any privileges that the

function modifies. This parameter can be NULL.</param>
/// <param name="ReturnLength">Pointer to a variable that receives the required size, in

bytes, of the buffer pointed to by the PreviousState parameter. This parameter can be NULL

if PreviousState is NULL.</param>
/// <returns>If the function succeeds, the return value is nonzero. To determine whether

the function adjusted all of the specified privileges, call

Marshal.GetLastWin32Error.</returns>
[ DllImport( "advapi32.dll", EntryPoint="AdjustTokenPrivileges", CharSet=CharSet.Ansi )]
private static extern int AdjustTokenPrivileges(IntPtr TokenHandle, int

DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, ref TOKEN_PRIVILEGES

PreviousState, ref int ReturnLength);
/// <summary>
/// The ExitWindowsEx function either logs off the current user, shuts down the system, or

shuts down and restarts the system. It sends the WM_QUERYENDSESSION message to all

applications to determine if they can be terminated.
/// </summary>
/// <param name="uFlags">Specifies the type of shutdown.</param>
/// <param name="dwReserved">This parameter is ignored.</param>
/// <returns>If the function succeeds, the return value is nonzero.<br></br><br>If the

function fails, the return value is zero. To get extended error information, call

Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "user32.dll", EntryPoint="ExitWindowsEx", CharSet=CharSet.Ansi )]
private static extern int ExitWindowsEx(int uFlags, int dwReserved);
/// <summary>
/// The FormatMessage function formats a message string. The function requires a message

definition as input. The message definition can come from a buffer passed into the function.

It can come from a message table resource in an already-loaded module. Or the caller can ask

the function to search the system's message table resource(s) for the message definition.

The function finds the message definition in a message table resource based on a message

identifier and a language identifier. The function copies the formatted message text to an

output buffer, processing any embedded insert sequences if requested.
/// </summary>
/// <param name="dwFlags">Specifies aspects of the formatting process and how to interpret

the lpSource parameter. The low-order byte of dwFlags specifies how the function handles

line breaks in the output buffer. The low-order byte can also specify the maximum width of a

formatted output line.</param>
/// <param name="lpSource">Specifies the location of the message definition. The type of

this parameter depends upon the settings in the dwFlags parameter.</param>
/// <param name="dwMessageId">Specifies the message identifier for the requested message.

This parameter is ignored if dwFlags includes FORMAT_MESSAGE_FROM_STRING.</param>
/// <param name="dwLanguageId">Specifies the language identifier for the requested

message. This parameter is ignored if dwFlags includes FORMAT_MESSAGE_FROM_STRING.</param>
/// <param name="lpBuffer">Pointer to a buffer for the formatted (and null-terminated)

message. If dwFlags includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer

using the LocalAlloc function, and places the pointer to the buffer at the address specified

in lpBuffer.</param>
/// <param name="nSize">If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this

parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If

FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs

to allocate for an output buffer. For ANSI text, this is the number of bytes; for Unicode

text, this is the number of characters.</param>
/// <param name="Arguments">Pointer to an array of values that are used as insert values

in the formatted message. A %1 in the format string indicates the first value in the

Arguments array; a %2 indicates the second argument; and so on.</param>
/// <returns>If the function succeeds, the return value is the number of TCHARs stored in

the output buffer, excluding the terminating null character.<br></br><br>If the function

fails, the return value is zero. To get extended error information, call

Marshal.GetLastWin32Error.</br></returns>
[ DllImport( "user32.dll", EntryPoint="FormatMessageA", CharSet=CharSet.Ansi )]
private static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, int

dwLanguageId, StringBuilder lpBuffer, int nSize, int Arguments);

/// <summary>
/// Exits windows (and tries to enable any required access rights, if necesarry).
/// </summary>
/// <param name="how">One of the RestartOptions values that specifies how to exit

windows.</param>
/// <param name="force">True if the exit has to be forced, false otherwise.</param>
/// <exception cref="PrivilegeException">There was an error while requesting a required

privilege.</exception>
/// <exception cref="PlatformNotSupportedException">The requested exit method is not

supported on this platform.</exception>
public static void ExitWindows(RestartOptions how , bool force ) {
switch(how) {
case RestartOptions.Suspend:
SuspendSystem(false, force);
break;
case RestartOptions.Hibernate:
SuspendSystem(true, force);
break;
default:
ExitWindows((int)how, force);
break;
}
}
/// <summary>
/// Exits windows (and tries to enable any required access rights, if necesarry).
/// </summary>
/// <param name="how">One of the RestartOptions values that specifies how to exit

windows.</param>
/// <param name="force">True if the exit has to be forced, false otherwise.</param>
/// <remarks>This method cannot hibernate or suspend the system.</remarks>
/// <exception cref="PrivilegeException">There was an error while requesting a required

privilege.</exception>
protected static void ExitWindows(int how , bool force ) {
EnableToken("SeShutdownPrivilege");
if (force )
how = how | EWX_FORCE;
if (ExitWindowsEx(how, 0) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error()));
}
/// <summary>
/// Tries to enable the specified privilege.
/// </summary>
/// <param name="privilege">The privilege to enable.</param>
/// <exception cref="PrivilegeException">There was an error while requesting a required

privilege.</exception>
protected static void EnableToken(string privilege ) {
if (!CheckEntryPoint("advapi32.dll", "AdjustTokenPrivileges"))
return;
IntPtr tokenHandle = IntPtr.Zero;
LUID privilegeLUID = new LUID();
TOKEN_PRIVILEGES newPrivileges = new TOKEN_PRIVILEGES();
TOKEN_PRIVILEGES tokenPrivileges ;
if (OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_ADJUST_PRIVILEGES |

TOKEN_QUERY, ref tokenHandle) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error()));
if (LookupPrivilegeValue("", privilege, ref privilegeLUID) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error()));
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
tokenPrivileges.Privileges.pLuid = privilegeLUID;
int size = 4;
if (AdjustTokenPrivileges(tokenHandle, 0, ref tokenPrivileges, 4 + (12 *

tokenPrivileges.PrivilegeCount), ref newPrivileges, ref size) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error()));
}
/// <summary>
/// Suspends or hibernates the system.
/// </summary>
/// <param name="hibernate">True if the system has to hibernate, false if the system has

to be suspended.</param>
/// <param name="force">True if the exit has to be forced, false otherwise.</param>
/// <exception cref="PlatformNotSupportedException">The requested exit method is not

supported on this platform.</exception>
protected static void SuspendSystem(bool hibernate , bool force  ){
if (!CheckEntryPoint("powrprof.dll", "SetSuspendState"))
throw new PlatformNotSupportedException("The SetSuspendState method is not supported on

this system!");
SetSuspendState((int)(hibernate ? 1 : 0), (int)(force ? 1 : 0), 0);
}
/// <summary>
/// Checks whether a specified method exists on the local computer.
/// </summary>
/// <param name="library">The library that holds the method.</param>
/// <param name="method">The entry point of the requested method.</param>
/// <returns>True if the specified method is present, false otherwise.</returns>
protected static bool CheckEntryPoint(string library , string method ) {
IntPtr  libPtr = LoadLibrary(library);
if (!libPtr.Equals(IntPtr.Zero)) {
if (!GetProcAddress(libPtr, method).Equals(IntPtr.Zero)) {
FreeLibrary(libPtr);
return true;
}
FreeLibrary(libPtr);
}
return false;
}
/// <summary>
/// Formats an error number into an error message.
/// </summary>
/// <param name="number">The error number to convert.</param>
/// <returns>A string representation of the specified error number.</returns>
protected static string FormatError(int number ) {
StringBuilder buffer =new StringBuilder(255);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, IntPtr.Zero, number, 0, buffer,

buffer.Capacity, 0);
return buffer.ToString();
}
}
/// <summary>
/// The exception that is thrown when an error occures when requesting a specific privilege.
/// </summary>
public class PrivilegeException : Exception {
/// <summary>
/// Initializes a new instance of the PrivilegeException class.
/// </summary>
public PrivilegeException () : base() {}
/// <summary>
/// Initializes a new instance of the PrivilegeException class with a specified error

message.
/// </summary>
/// <param name="message">The message that describes the error.</param>
public PrivilegeException (string message ) :base(message) {}

(责任编辑 火凤凰 sunsj@51cto.com  TEL:(010)68476636-8007)


发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看52371次)
·UML类图详解 (查看46839次)
·Java编程开发手册 (查看25118次)
·UML统一建模语言 (查看24099次)
·C#技术开发指南 (查看22406次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (251个好)
·PB开发教程 (209个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有