想解决的问题:定时控制电脑联网,设置电脑在特定时间段才能连接上网络,场景(限制小孩在特定的时间内上网)
思路:利用windows服务,定时执行,根据设置的时间段调整网络连接状态
定时服务比较简单,难点在于控制网络连接,测试成功的方法有:
一、使用Hnetcfg.dll,在“安装管理程序包”中直接安装(.net framework4.5以上版本引用)
/// <summary>
/// 启用网络
/// </summary>
static void EnableNetWork()
{
NetSharingManagerClass netSharingMgr = new NetSharingManagerClass();
INetSharingEveryConnectionCollection connections = netSharingMgr.EnumEveryConnection;
foreach (INetConnection connection in connections)
{
INetConnectionProps connProps = netSharingMgr.get_NetConnectionProps(connection);
if (connProps.MediaType == tagNETCON_MEDIATYPE.NCM_LAN)
{
connection.Connect();
}
}
}
/// <summary>
/// 禁用网络
/// </summary>
static void DisableNetWork()
{
NetSharingManagerClass netSharingMgr = new NetSharingManagerClass();
INetSharingEveryConnectionCollection connections = netSharingMgr.EnumEveryConnection;
foreach (INetConnection connection in connections)
{
INetConnectionProps connProps = netSharingMgr.get_NetConnectionProps(connection);
if (connProps.MediaType == tagNETCON_MEDIATYPE.NCM_LAN)
{
connection.Disconnect();
}
}
}
二、C#执行cmd命令
用到的命令如下:
netsh interface show interface #查看网络连接
netsh interface set interface name="以太网" admin=DISABLED #禁用网络连接
netsh interface set interface name="以太网" admin=ENABLED #启用网络连接
先查看网络连接名称,然后根据名称禁用对应的网络连接,多个网络可以选择性的执行多条命令
控制台调用代码如下:
static void Main(string[] args)
{
//netsh interface show interface #查看网络连接
string DisableCmd = "netsh interface set interface name=\"以太网\" admin=DISABLED";
string EnableCmd = "netsh interface set interface name=\"以太网\" admin=ENABLED";
string put = RunCmd(DisableCmd); //执行命令
}
/// <summary>
/// 执行cmd命令 返回cmd窗口显示的信息
/// 多命令请使用批处理命令连接符:
/// <![CDATA[
/// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
/// </summary>
/// <param name="cmd">执行的命令</param>
public static string RunCmd(string cmd)
{
string CmdPath = @"C:\Windows\System32\cmd.exe";
cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
using (Process p = new Process())
{
p.StartInfo.FileName = CmdPath;
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
p.StartInfo.CreateNoWindow = true; //不显示程序窗口
p.Start();//启动程序
//向cmd窗口写入命令
p.StandardInput.WriteLine(cmd);
p.StandardInput.AutoFlush = true;
//获取cmd窗口的输出信息
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
return output;
}
}
注意事项有以下几点
1、Interop.NETCONLib这个dll的属性“嵌入互操作类型”设置为false
2、该操作需要较高的权限,若要开发的程序自动以管理员权限运行,需特殊配置,
先启用ClickOnce安全设置,勾选
修改app.manifest文件中的配置项,requestedExecutionLevel修改如下:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
调整启用ClickOnce安全设置,去掉勾选
windows定时服务
public System.Timers.Timer gtimer = new System.Timers.Timer();
protected override void OnStart(string[] args)
{
//启动,并添加日志
AddLog("service Start");
gtimer = new System.Timers.Timer();
gtimer.Interval = 1000;//此处设置为1秒,1秒执行一次
gtimer.Elapsed += new System.Timers.ElapsedEventHandler(ServiceStart);//到达时间的时候执行事件;
gtimer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
gtimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
}
public void ServiceStart(object source, System.Timers.ElapsedEventArgs e)
{
//先暂停计时器,然后执行操作,最后再启动计时器,防止执行操作时长>间隔时长,导致重复执行
gtimer.Enabled = false;
//开始执行操作
DosomeThing();
//再次启动计时器
gtimer.Enabled = true;
}
protected override void OnStop()
{
//停止,并添加日志
AddLog("service End");
}
参考文档:
http://www.yishimei.cn/network/296.html