有关局域网对远程电脑的关机,和开机问题?要用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 --------------------编程问答--------------------
--------------------编程问答-------------------- 6楼up~~~
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();
补充:.NET技术 , C#