我想控制电脑上网时间,比如到晚上12点时,用程序把所有的电脑上网断开?

解决方案 »

  1.   

    C# 连接SQLite做了一个每天定时关闭网络连接的服务 
          最近老婆怀孕为了控制她上网看电影的时间做了一个每天在规定的时间短开网络连接的windows服务。      首先用SQLite做了两个表一个是netconnection填写网络连接的信息(我是单独拉的联通2M带宽,adsl上网)。一个netweek存放平时和周末两种情况下断网的时间。       首先写了一个封装SQLite操作的简单类(参考网络上的内容):       using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.SQLite;namespace autonet
    {   
        class Db
        {
            SQLiteConnection conn ;
            SQLiteCommand com;
            public Db(string strConn)
            {
                conn = new SQLiteConnection("Data Source=" + strConn);
                com = conn.CreateCommand();
                conn.Open();
            }
            public void Open()
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
            }        public void Close()
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }        public void DoNoneSQL(string strnonesql)
            {
                com.CommandText = strnonesql;
                com.ExecuteNonQuery();
            }
            public int DoIntSQL(string strdointsql)
            {
                int t;
                com.CommandText = strdointsql;
                t= com.ExecuteNonQuery();
                return t;
            }
            public void DoNoneSQL(string strnonesql, SQLiteParameter[] pars)
            {
                ParamentsCommand(strnonesql, pars);
                DoNoneSQL(strnonesql);
            }
            public SQLiteDataReader DoDataReader(string strdatareadersql)
            {
                com.CommandText = strdatareadersql;
                return com.ExecuteReader();
            }
            public SQLiteDataReader DoDataReader(string strdatareadersql, SQLiteParameter[] pars)
            {
                ParamentsCommand(strdatareadersql, pars);
                return DoDataReader(strdatareadersql);
            }
            public DataTable DoDataTable(string strdatatablesql)
            {
                com.CommandText = strdatatablesql;
                SQLiteDataAdapter sda = new SQLiteDataAdapter(com);
                DataTable db = new DataTable();
                sda.Fill(db);
                return db;
            }
            public DataTable DoDataTable(string strdatatablesql, SQLiteParameter[] pars)
            {
                ParamentsCommand(strdatatablesql, pars);
                return DoDataTable(strdatatablesql);
            }
            public void BeginTrans()
            {
                conn.BeginTransaction();
            }
            public void Commit()
            {
                conn.BeginTransaction().Commit();
            }
            public void ParamentsCommand(string strcontext, SQLiteParameter[] compars)
            {
                com.CommandText = strcontext;
                if (compars != null)
                {
                    foreach (SQLiteParameter par in compars)
                    {
                        if (par.Value == null)
                            par.Value = DBNull.Value;
                        com.Parameters.Add(par);
                    }
                }
            }
            public SQLiteParameter MakeSQLiteParameter(string name, DbType type, object value)
            {
                SQLiteParameter par = new SQLiteParameter(name,type);
                par.Value = value;
                return par;
            }
        }}
             然后封装简单的连接拨号和断开拨号程序:
     using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ComponentModel;
    using System.Threading;
    using System.Diagnostics;
    using System.Runtime.InteropServices;namespace autonet
    {   
        class modemnet
        {
            private static Mutex mutex = new Mutex();
            private Process pro = new Process();
            private int Desc;
            private int connectcount;//连接次数0表示断开1表示连接
            private int disconnectcount;//断开次数0表示连接1表示断开
            private bool status;//true:connected false:not connected
            private string connname;//连接名字
            private string connusername;//连接帐号用户
            private string connpwd;//连接密码
            [DllImport("wininet.dll")]
            private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
            public string NetName
            {
                set { this.connname = value; }
            }
            public string UserName
            {
                set { this.connusername = value; }
            }
            public string Pwd
            {
                set { this.connpwd = value; }
            }
            public int ConnectNum
            {
                get{ return connectcount;}
            }
            public int DisConnectNum
            {
                get { return disconnectcount; }
            }
            private bool isconnecting()
            {
                status = InternetGetConnectedState(out Desc, 0);
                return status;
            }
            private bool isactive(string strProName)
            {
                Process[] ps = Process.GetProcessesByName(strProName);
                {
                    if (ps.Length > 0)
                        return true;
                    else
                        return false;
                }
            }        public void StopConn()
            {
                if (isconnecting())
                {
                    lock (pro)
                    {
                        if (!isactive("rasdial"))
                        {
                            mutex.WaitOne();
                            //pro.StartInfo.FileName = "rundll32.exe";
                            //pro.StartInfo.Arguments = "iedkcs32.dll CloseRASConnections";
                            pro.StartInfo.FileName = "rasdial.exe";
                            pro.StartInfo.Arguments = this.connname + @" /DISCONNECT";
                            pro.Start();
                            mutex.ReleaseMutex();
                            disconnectcount++;
                            connectcount--;
                        }
                    }
                    pro.Close();
                }
            }
            public void startconn()
            {
                if (!isconnecting())
                {
                    lock (pro)
                    {
                        if (!isactive("rasdial"))
                        {
                            mutex.WaitOne();
                            pro.StartInfo.FileName = "rasdial.exe";
                            pro.StartInfo.Arguments = this.connname + " " + this.connusername + " " + this.connpwd;
                            pro.Start();
                            mutex.ReleaseMutex();
                            connectcount++;
                            disconnectcount--;
                        }
                    }
                    pro.Close();
                }
            }
        }
    }
            后面就是简单的调用了,就是 0.开始先连接网络,然后 1.检查是否需要执行该功能(在netconnection中有字段表示)  2.是否到达配置的断网时间  3.1和2都
    true,执行断网,否则连接网络         在过程中对SQLite里面执行update语句让我检查了好久,首先是DB文件找错了,执行后检查都结果总是不对,后来发现这个问题后执行update还是不对。愁。 原来是在一个连接下事务不能嵌套。 
            拨号程式的名字如果带空格就要用双引号引起来执行命令        windows服务中若用timer控件是System.Timers 下的timer.