当前位置:编程学习 > C#/ASP.NET >>

有关局域网对远程电脑的关机,和开机问题?要用C#语言实现

用C#代码,实现对本地关机,很简单。
但是对局域网中其他电脑实现关机,请假各位仁兄怎么样实现?网络是通的,网卡和主机也支持唤醒功能,请问C#代码如何实现对局域网其它电脑的开机和关机。
也知道网卡的MAC地址。能有代码最好。 --------------------编程问答-------------------- ref:http://topic.csdn.net/t/20030923/15/2291294.html --------------------编程问答-------------------- Mark --------------------编程问答-------------------- Up --------------------编程问答-------------------- 关机好弄,开机不知道
关机:shutdown 命令和其相关参数 --------------------编程问答-------------------- 开机的话,你在在主板上开启网卡远程唤醒 --------------------编程问答-------------------- 被你害的不浅啊,点了下关,其他代码还没保存呢,就这么没了………………
这个是控制本地的,可以远程控制哈
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices; 

namespace WindowsApplication1
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
[DllImport("kernel32.dll",   ExactSpelling=true)   ]   
internal   static   extern   IntPtr   GetCurrentProcess();   
    
[DllImport("advapi32.dll",   ExactSpelling=true,   SetLastError=true)   ]   
internal   static   extern   bool   OpenProcessToken(   IntPtr   h,   int   acc,   ref   IntPtr   phtok   );   
    
[DllImport("advapi32.dll",   SetLastError=true)   ]   
internal   static   extern   bool   LookupPrivilegeValue(   string   host,   string   name,   ref   long   pluid   );   
    
[DllImport("advapi32.dll",   ExactSpelling=true,   SetLastError=true)   ]   
internal   static   extern   bool   AdjustTokenPrivileges(   IntPtr   htok,   bool   disall, ref   TokPriv1Luid   newst,   int   len,   IntPtr   prev,   IntPtr   relen   );   
    
[DllImport("user32.dll",   ExactSpelling=true,   SetLastError=true)   ]   
internal   static   extern   bool   ExitWindowsEx(   int   易做图,   int   rea   );   

internal   const   int   SE_PRIVILEGE_ENABLED   =   0x00000002;   
internal   const   int   TOKEN_QUERY   =   0x00000008;   
internal   const   int   TOKEN_ADJUST_PRIVILEGES   =   0x00000020;   
internal   const   string   SE_SHUTDOWN_NAME   =   "SeShutdownPrivilege";   
internal   const   int   EWX_LOGOFF   =   0x00000000;   
internal   const   int   EWX_SHUTDOWN   =   0x00000001;   
internal   const   int   EWX_REBOOT   =   0x00000002;   
internal   const   int   EWX_FORCE   =   0x00000004;   
internal   const   int   EWX_POWEROFF   =   0x00000008;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;   
internal   const   int   EWX_FORCEIFHUNG   =   0x00000010;   
    
private   static   void   DoExitWin(   int   易做图   )   
{   
bool   ok;   
TokPriv1Luid   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(   易做图,   0   );   
}   
    
public   static   void   Reboot()   
{   
DoExitWin(     EWX_FORCE   |   EWX_REBOOT   );   
}   
    
public   static   void   PowerOff()   
{   
DoExitWin(       EWX_FORCE   |   EWX_POWEROFF   );   
}   
    
public   static   void   LogoOff()   
{   
DoExitWin   (     EWX_FORCE   |   EWX_LOGOFF   );   
}   

private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(184, 136);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "关";
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// button2
// 
this.button2.Location = new System.Drawing.Point(184, 72);
this.button2.Name = "button2";
this.button2.TabIndex = 1;
this.button2.Text = "注销";
this.button2.Click += new System.EventHandler(this.button2_Click);
// 
// button3
// 
this.button3.Location = new System.Drawing.Point(168, 176);
this.button3.Name = "button3";
this.button3.TabIndex = 2;
this.button3.Text = "重新启动";
this.button3.Click += new System.EventHandler(this.button3_Click);
// 
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
PowerOff() ;
}

private void button2_Click(object sender, System.EventArgs e)
{
LogoOff();
}

private void button3_Click(object sender, System.EventArgs e)
{
Reboot() ;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}

}
}
--------------------编程问答-------------------- 远程唤醒需要使用协议

网络远程唤醒是通过MAC地址来控制的,
包的格式很简单,在以太网包的任何位置上,
以6个FF为先导,后面跟相应MAC地址重复16次即可: 

FF FF FF FF FF FF 08 65 88 a0 00 38 ... ... 08 65 88 a0 00 38

具体可以使用UDP发送广播包即可
对应MAC地址的网卡会处理这个请求并唤醒主机

--------------------编程问答-------------------- to zbking:
哈哈,刚才我的电脑也注销了。没敢点 “关”
那么如何关闭 局域网内的其它主机呢,假如知道IP或者name。 --------------------编程问答-------------------- 知道IP或Name没用,
要知道远程计算机的网卡的MAC地址。
然后广播一个wakeup 就可以了。

网络远程唤醒是通过MAC地址来控制的,
包的格式很简单,在以太网包的任何位置上,
以6个FF为先导,后面跟相应MAC地址重复16次即可: 

FF FF FF FF FF FF 08 65 88 a0 00 38 ... ... 08 65 88 a0 00 38

具体可以使用UDP发送广播包即可
对应MAC地址的网卡会处理这个请求并唤醒主机
--------------------编程问答-------------------- 谢谢大家回复这么多,我还不能确定你们的方法能否行的通,我会自己试的。可惜这个网址不能上传附件,要不然,我做好可以把源代码发上来,给大家参考。 --------------------编程问答-------------------- mark
--------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 搞这些没用的东西干嘛??别人有防火墙你就没办法了. --------------------编程问答-------------------- LS试验用的 --------------------编程问答-------------------- up --------------------编程问答-------------------- 顶顶顶

--------------------编程问答-------------------- mark --------------------编程问答-------------------- mark
--------------------编程问答-------------------- mark --------------------编程问答-------------------- 使用WMI , 可以提供控制远程PC的方法。 
但是需要SERVERIP, USERNAME, PASSWORD。 
三年前试过,没有问题。
--------------------编程问答-------------------- 好东西,收藏。 --------------------编程问答-------------------- 收藏 --------------------编程问答-------------------- UP --------------------编程问答-------------------- 谢谢大家的积极回复,等过段时间,我试出来没有问题。就马上给我认为,对我有帮助的兄弟加分。谢谢你们的回复。我这段时间很忙,说句实话,还没去试。还在搞别的。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- MARK~ --------------------编程问答-------------------- 学习ing --------------------编程问答--------------------

            using System.Diagnostics;
            string errorMsg=null;
            Process pro = new Process();
            pro.StartInfo.FileName = "cmd.exe";
            pro.StartInfo.RedirectStandardInput = true;
            pro.StartInfo.RedirectStandardOutput = true;
            pro.StartInfo.UseShellExecute = false;
            pro.StartInfo.RedirectStandardError = true;
            pro.StartInfo.CreateNoWindow = true;
            pro.Start();
            pro.StandardInput.WriteLine("shutdown -s -m \\"+IP);
            pro.StandardInput.WriteLine("exit");
            errorMsg=pro.StandardOutput.ReadToEnd();
            if (errorMsg != null)
            {
                MessageBox.Show(errorMsg);
            }
            pro.Close();
--------------------编程问答-------------------- 6楼up~~~
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,