Windows服务定时控制电脑联网(定时服务、 网络连接控制)

10 篇文章 0 订阅
2 篇文章 0 订阅

想解决的问题:定时控制电脑联网,设置电脑在特定时间段才能连接上网络,场景(限制小孩在特定的时间内上网)

思路:利用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

https://www.cnblogs.com/lhxsoft/p/11734504.html

http://www.manongjc.com/article/125881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值