• 使用C#注销/关闭计算机


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

    namespace 文件和系统操作
    {

    public class 注销和关闭计算机 : System.Windows.Forms.Form
    {
    [StructLayout(LayoutKind.Sequential, Pack=1)]
    public struct TokPrivlLuid
    {
    public int Count;
    public long Luid;
    public int Attr;
    }
    // GetCurrentProcess函数返回当前进程的一个句柄
    [DllImport("kernel32.dll",ExactSpelling=true)]
    public static extern IntPtr GetCurrentProcess();
    // OpenProcessToken 函数打开一个进程的访问代号
    [DllImport("advapi32.dll",ExactSpelling=true,SetLastError=true)]
    public static extern bool OpenProcessToken(IntPtr ProcessHandles, int DesiredAccess, ref IntPtr TokenHandle);
    // LookupPrivilegeValue 函数获得本地唯一标识符(LUID),用于在特定系统中表示特定优先权
    [DllImport("advapi32.dll",SetLastError=true)]
    public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref long lpLuid);
    // AdjustTokenPrivileges 函数使允许或者禁用指定访问记号的优先权
    // 允许或者禁用优先权需要TOKEN_ADJUST_PRIVILEGES 访问权限
    [DllImport("advapi32.dll",ExactSpelling=true,SetLastError=true)]
    public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges,
    ref TokPrivlLuid NewState, int BufferLength, IntPtr PreviousState, IntPtr ReturnLength);
    // ExitWindowsEx 函数可以退出登陆、关机或者重新启动系统
    [DllImport("user32.dll",ExactSpelling=true,SetLastError=true)]
    public static extern bool ExitWindowsEx(int flg, int rea);

    private System.Threading.Timer timer;
    private const int SE_PRIVILEGE_ENABLED = 0x00000002;
    private const int TOKEN_QUERY = 0x00000008;
    private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
    private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
    private const int EWX_LOGOFF = 0x00000000;//注销
    private const int EWX_SHUTDOWN = 0x00000001;//关机
    private const int EWX_REBOOT = 0x00000002;//重起
    private const int EWX_FORCE = 0x00000004;

    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;
    private System.Windows.Forms.Button button3;

    private System.ComponentModel.Container components = null;

    public 注销和关闭计算机()
    {
    InitializeComponent();

    this.textBox1.Text = (Environment.TickCount / (1000 * 60)).ToString() + "分钟";
    timer = new System.Threading.Timer(new TimerCallback(OnTimer), null, 0, 1000);
    }
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.label1 = new System.Windows.Forms.Label();
    this.textBox1 = new System.Windows.Forms.TextBox();
    this.button1 = new System.Windows.Forms.Button();
    this.button2 = new System.Windows.Forms.Button();
    this.button3 = new System.Windows.Forms.Button();
    this.SuspendLayout();
    //
    // label1
    //
    this.label1.Location = new System.Drawing.Point(56, 32);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(168, 23);
    this.label1.TabIndex = 0;
    this.label1.Text = "系统已运行时间";
    //
    // textBox1
    //
    this.textBox1.Location = new System.Drawing.Point(56, 72);
    this.textBox1.Name = "textBox1";
    this.textBox1.Size = new System.Drawing.Size(176, 21);
    this.textBox1.TabIndex = 1;
    this.textBox1.Text = "";
    //
    // button1
    //
    this.button1.Location = new System.Drawing.Point(40, 144);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(56, 23);
    this.button1.TabIndex = 2;
    this.button1.Text = "关闭";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    //
    // button2
    //
    this.button2.Location = new System.Drawing.Point(128, 144);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(56, 23);
    this.button2.TabIndex = 3;
    this.button2.Text = "注销";
    this.button2.Click += new System.EventHandler(this.button2_Click);
    //
    // button3
    //
    this.button3.Location = new System.Drawing.Point(216, 144);
    this.button3.Name = "button3";
    this.button3.Size = new System.Drawing.Size(56, 23);
    this.button3.TabIndex = 4;
    this.button3.Text = "重起";
    this.button3.Click += new System.EventHandler(this.button3_Click);
    //
    // 注销和关闭计算机
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(304, 214);
    this.Controls.Add(this.button3);
    this.Controls.Add(this.button2);
    this.Controls.Add(this.button1);
    this.Controls.Add(this.textBox1);
    this.Controls.Add(this.label1);
    this.Name = "注销和关闭计算机";
    this.Text = "注销和关闭计算机";
    this.ResumeLayout(false);

    }
    #endregion

    private static void RebootCommand(int flg)
    {
    bool ok;
    TokPrivlLuid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_ENABLED;
    ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
    ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
    ok = ExitWindowsEx(flg, 0);
    }

    //获得系统已运行的时间
    private void OnTimer(object state)
    {
    this.textBox1.Text = (Environment.TickCount / (1000 * 60)).ToString() + "分钟";
    this.textBox1.Refresh();
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
    RebootCommand(EWX_SHUTDOWN + EWX_FORCE);
    }

    private void button2_Click(object sender, System.EventArgs e)
    {
    RebootCommand(EWX_LOGOFF + EWX_FORCE);
    }

    private void button3_Click(object sender, System.EventArgs e)
    {
    RebootCommand(EWX_REBOOT + EWX_FORCE);
    }
    }
    }
  • 相关阅读:
    Python文件File方法
    python的slice notation的特殊用法
    函数
    字典
    python 笔记7
    列表解析与生成器
    [CenOS7][Mac] MAC环境中dubbo连接zookeeper超时
    [JAVA][Thread] 实现Runnable接口和继承Thread类创建线程哪种方式更好?
    [Java] String字符常量类型作为参数传递的一些问题
    [JAVA]hashCode()和identityHashCode()的区别
  • 原文地址:https://www.cnblogs.com/sizzle/p/890717.html
Copyright © 2020-2023  润新知