2011年2月1日星期二

使用DotRas进行VPN拨号

 

/// <summary>
       /// 初始化VPN連接
       ///
       /// </summary>
       private void InitVpnEntry(){
           try
           {
               this.AllUsersPhoneBook.Open();
               entry = RasEntry.CreateVpnEntry(EntryName, "61.155.18.16", RasVpnStrategy.Default,
                   RasDevice.GetDeviceByName("(PPTP)", RasDeviceType.Vpn));
               entry.Options.RemoteDefaultGateway = bDefaultGw;
               entry.Options.NetworkLogOn = false;
               entry.Options.PreviewDomain = false;
               this.AllUsersPhoneBook.Entries.Remove(entry.Name);
               this.AllUsersPhoneBook.Entries.Add(entry);
               this.statusbar.Text = "VPN连接创建成功,程序初始化完成!";
               this.DisconnectButton.Enabled = false;
           }catch(Exception ex){
               //MessageBox.Show(ex.GetType()+":打开或创建电话簿时发生错误。请检查VPN连接是否已经存在!");
           }
       }

       /// <summary>
       /// 建立VPN連接
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void button2_Click(object sender, EventArgs e)
       {
           InitVpnEntry();
           this.Dialer.EntryName = EntryName;
           this.Dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers);

           this.username = txtUsername.Text.Trim();
           this.password = txtPassword.Text.Trim();
           if (this.username.Length == 0 || this.password.Length == 0)
           {
               MessageBox.Show("请填写用户名和密码!");
               return;
           }

           try
           {
               this.Dialer.Credentials = new NetworkCredential(username,password);
               this.handle = this.Dialer.DialAsync();
               this.DisconnectButton.Enabled = true;
               this.BtnExit.Enabled = false;
               this.btnConnect.Enabled = false;
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.ToString());
           }
       }

/// <summary>
        /// 斷開VPN連接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DisconnectButton_Click(object sender, EventArgs e)
        {
            if (entry == null)
                return;
            if (this.Dialer.IsBusy)
            {
                this.Dialer.DialAsyncCancel();
            }
            else
            {
                RasConnection connection = RasConnection.GetActiveConnectionByHandle(this.handle);
                if (connection != null)
                {
                    connection.HangUp();
                }
            }
            this.BtnExit.Enabled = true;
            this.btnConnect.Enabled = true;
            this.DisconnectButton.Enabled = false;
            this.statusbar.Text = "VPN连接已断开!";
        }

/// <summary>
       /// 異步VPN連接過程回調函數
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void Dialer_StateChanged(object sender, StateChangedEventArgs e)
       {
           this.statusbar.Text = e.State.ToString();
       }

       /// <summary>
       /// 異步VPN連接過程回調函數
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void Dialer_DialCompleted(object sender, DialCompletedEventArgs e)
       {
           if (e.Cancelled)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = "拨号已被取消!";
           }
           else if (e.TimedOut)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = "连接超时!";
           }
           else if (e.Error != null)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = e.Error.ToString();
           }
           else if (e.Connected)
           {
               this.DisconnectButton.Enabled = true;
               this.BtnExit.Enabled = false;
               this.btnConnect.Enabled = false;
               this.statusbar.Text = "VPN拨号成功!";
               WriteSettings();
               GetVpnClientIp();
           }

           if (!e.Connected)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = "未能成功连接VPN服务器!";
               MessageBox.Show("VPN拨号失败!请检查服务器是否正常,用户名和密码是否正确。");
           }
       }

C#中保存和装载配置文件(ini)的类及使用示例代码

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
using System.Windows.Forms;

namespace VPNClient
{
    public class Settings
    {
        XmlDocument doc;
        string fileName;
        string rootName;

        public Settings(string fileName, string rootName)
        {
            this.fileName = fileName;
            this.rootName = rootName;

            doc = new XmlDocument();

            try
            {
                doc.Load(fileName);
            }
            catch (System.IO.FileNotFoundException)
            {
                CreateSettingsDocument();
            }
        }

        public Settings(string fileName)
            : this(fileName, "Settings")
        {
        }

        //Deletes all entries of a section
        public void ClearSection(string section)
        {
            XmlNode root = doc.DocumentElement;
            XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section);

            if (s == null)
                return;  //not found

            s.RemoveAll();
        }

        //initializes a new settings file with the XML version
        //and the root node
        protected void CreateSettingsDocument()
        {
            doc.AppendChild(doc.CreateXmlDeclaration("1.0", null, null));
            doc.AppendChild(doc.CreateElement(rootName));
        }

        public void Flush()
        {
            try
            {
                doc.Save(fileName);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //removes a section and all its entries
        public void RemoveSection(string section)
        {
            XmlNode root = doc.DocumentElement;
            XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section);

            if (s != null)
                root.RemoveChild(s);
        }

        public void Save()
        {
            Flush();
        }


        #region Read methods

        public bool ReadBool(string section, string name, bool defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == Boolean.TrueString)
                return true;
            else if (s == Boolean.FalseString)
                return false;
            else
                return defaultValue;
        }

        public DateTime ReadDateTime(string section, string name, DateTime defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    DateTime dt = Convert.ToDateTime(s);
                    return dt;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public double ReadDouble(string section, string name, double defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    double d = Convert.ToDouble(s);
                    return d;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public float ReadFloat(string section, string name, float defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    float f = Convert.ToSingle(s);
                    return f;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public int ReadInt(string section, string name, int defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    int n = Convert.ToInt32(s);
                    return n;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public long ReadLong(string section, string name, long defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    long l = Convert.ToInt64(s);
                    return l;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public short ReadShort(string section, string name, short defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    short n = Convert.ToInt16(s);
                    return n;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public string ReadString(string section, string name, string defaultValue)
        {
            XmlNode root = doc.DocumentElement;
            XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section);

            if (s == null)
                return defaultValue;  //not found

            XmlNode n = s.SelectSingleNode(name);

            if (n == null)
                return defaultValue;  //not found

            XmlAttributeCollection attrs = n.Attributes;

            foreach (XmlAttribute attr in attrs)
            {
                if (attr.Name == "value")
                    return attr.Value;
            }

            return defaultValue;
        }

        public uint ReadUInt(string section, string name, uint defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    uint n = Convert.ToUInt32(s);
                    return n;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public ulong ReadULong(string section, string name, ulong defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    ulong l = Convert.ToUInt64(s);
                    return l;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        public ushort ReadUShort(string section, string name, ushort defaultValue)
        {
            string s = ReadString(section, name, "");

            if (s == "")
                return defaultValue;
            else
            {
                try
                {
                    ushort n = Convert.ToUInt16(s);
                    return n;
                }
                catch (FormatException)
                {
                    return defaultValue;
                }
            }
        }

        #endregion


        #region Write methods

        public void WriteBool(string section, string name, bool value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteDateTime(string section, string name, DateTime value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteDouble(string section, string name, double value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteFloat(string section, string name, float value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteInt(string section, string name, int value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteLong(string section, string name, long value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteShort(string section, string name, short value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteString(string section, string name, string value)
        {
            XmlNode root = doc.DocumentElement;
            XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section);

            if (s == null)
                s = root.AppendChild(doc.CreateElement(section));

            XmlNode n = s.SelectSingleNode(name);

            if (n == null)
                n = s.AppendChild(doc.CreateElement(name));

            XmlAttribute attr = ((XmlElement)n).SetAttributeNode("value", "");
            attr.Value = value;
        }

        public void WriteUInt(string section, string name, uint value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteULong(string section, string name, ulong value)
        {
            WriteString(section, name, value.ToString());
        }

        public void WriteUShort(string section, string name, ushort value)
        {
            WriteString(section, name, value.ToString());
        }

        #endregion

    }
}

使用示例代码

private void LoadSettings(){
            Settings s = new Settings("config.xml");
            bPasswdRemeber = s.ReadBool("Data1", "RemeberPassword", false);
            bDefaultGw = s.ReadBool("Data1", "UseDefaultGateway", false);
            username = s.ReadString("Data1", "Username", "");
            password = s.ReadString("Data1","Password","");
            this.txtUsername.Text = username;
            this.txtPassword.Text = password;
            this.cbxDefaultGW.Checked = bDefaultGw;
            this.cbxPassword.Checked = bPasswdRemeber;
        }

        private void WriteSettings(){
            username = this.txtUsername.Text.Trim();
            password = this.txtPassword.Text.Trim();
            bDefaultGw = this.cbxDefaultGW.Checked;
            bPasswdRemeber = this.cbxPassword.Checked;

            Settings s = new Settings("config.xml");
            s.WriteBool("Data1", "RemeberPassword", bPasswdRemeber);
            s.WriteBool("Data1", "UseDefaultGateway", bDefaultGw);
            if(bPasswdRemeber){
                s.WriteString("Data1", "Username", username);
                s.WriteString("Data1", "Password", password);
            }else{
                s.WriteString("Data1", "Username", "");
                s.WriteString("Data1", "Password", "");
            }
            s.Save();
        }

生成的config.xml数据文件

<?xml version="1.0"?>
<Settings>
  <Data1>
    <RemeberPassword value="True" />
    <UseDefaultGateway value="False" />
    <Username value="jimshen" />
    <Password value=jimshen!#$%%^ />
  </Data1>
</Settings>

2011年1月6日星期四

在Office中判断打开文件的数量

 

excel中的判断

If Workbooks.count = 0 Then
        Exit Sub
End If

 

word中的判断

If Documents.count = 0 Then
        Exit Sub
End If

2011年1月5日星期三

郎咸平警告:中国如果开征房产税 后果将会很严重

首先我们得搞清楚,房产税究竟指的是什么。开始叫物业税,后来说是房产税,现在还有人说地产税,还有财产税,特别消费税等等。我们国家的土地自1982年的《宪法》修改以后,变成了土地国有化。其实,在1954年《宪法》的时候,仍然是承认农民拥有土地及相关生产资料的,只是在1982年的《宪法》中改掉了。因为物业税的征收需要人大的一个立法程序,所以就提出了房产税,房产税的暂行条例 1986年就通过了,对经营性的住房进行征税,但是非经营的、自住的住房是不征税的。而且因为这个税种的征税很难,地方的一些税务局就和一些居委会结合起来,透过奖励举报的方式进行全面征税。
这几年由于火山岩浆成型,政府又插下了两根导管,使得房价大涨,从而得罪了所有买不起房的人。政府再搞房产税的结果,又要得罪了所有买得起房的人。结果全国老百姓都被得罪了,那政府执政的基础怎么办呢?世界银行的报告《城市房产税的改革,指导原则与建议》给出了一个骇人听闻的结论――“房产税必然要承受非常沉重的政治代价”,我觉得这句话送给我们政府是最适当的。我希望我们政府不要被那些不要脸的、可恨的宠物经济学家所误导。这些学者可恨在哪里呢?他们是有权阶层和富人豢养的一群狗,当政府要做某个政策的时候,他们既不会站在老百姓的立场上,也不会站在科学的角度来考虑问题,只会争先恐后去巴结、表态。举个例子,这些宠物学者指出房产税的征收明显加大了住房保有环节的成本,对持有空置住房的投机人打击更大,使得他们从炒房中获得收益降低,从而可以将资金引向合理的经济领域,等等。这些评论基本都是扯淡。例如国信证券就曾经这么胡扯地指出,在推出物业税不成熟的情况之下,逐步推进房产税改革,将削弱房地产的投资品属性,有利于平抑房价,改变人们的心理预期。
我想请问这些学者,房产税的本质是什么?是用来打压房价的吗?你们连基本观念都搞错了。美国是土地私有,因此由土地所有人缴纳地产税有其合理性。如果美国人在自己的土地上发现了石油就归他个人所有,因为土地是私有的。而我们的土地是属于政府的,我们根本就没有缴纳房产税的私有化基础。地产开发商已经交过出让金了,而出让金就类同于租金,也就是说我们已经交过租金了。哪有交了租金之后,又替拥有土地的政府交房产税的道理啊?政府怎么能够想收就收啊?政府叫它物业税也好,地产税也好,房产税也好,反正就是不合法。如果我们在建房的土地下面发现了石油会是什么后果?肯定强制拆迁,把我们都赶跑。
而且美国推出房产税的目的不是为了打压房价,而是为了让房价升值,藏富于民,让老百姓获得更高的价值。举个例子,按照美国的做法,美国平均征收 1.38%的房产税,这个房产税28%给乡镇政府,22%给县政府,只有4%是给州政府的,总共54%。但是你要晓得,美国的乡镇政府跟县政府的政府官员实际是非常少的。一个县政府的政府官员搞不好只有三个人,一个是管司法的,一个是办理结婚证照的、证照查验的,还有一个行政官。他们县政府的人数比我们一个街道委员会的人数还要少,为什么?因为美国的政府很高效的,美国老百姓不会花钱养这么多政府官员,哪像我们,到处都是官员!
美国的地方政府拿到房产税后,会将其中54%用于聘用警察改善治安,搞建设改善环境,剩下46%的房产税将全部用于改善教育。美国公立中小学教育年度预算是3 000亿美金,全部来自于这46%的房产税。99%的美国人都是念公立学校,从幼稚园到高中毕业,总共13年,全部免费,有些富裕的学校中午吃饭还免费,这才是真正取之于民用之于民。
美国政府的所有支出全部有非常清楚的记录,老百姓可以上网随时查询,不像我们政府的预算简直就是一笔糊涂账。本地的治安、环境、学校都改善了,房价自然水涨船高。而增值的部分,美国政府抽取1.38%的地产税,剩下的98.62%都归地产所有人。这就是为什么美国人非常乐意交房产税,因为房产会增值。那我请问各位朋友,如果我们政府拿了房产税之后,它能把每一分钱都花在我们的环境上,花在我们子女的教育上,花在我们的人身安全保护上,都花在我们附近的花木、我们附近的环境卫生上,你愿不愿意交呢?你当然愿意。
美国房产税的本质之所以值得我们探索,是因为我们个人不可能有条件去改善居住环境、社区治安和学校教育,因此必须透过政府集合我们所有人的房产税,大面积地帮我们改善环境、改善治安、改善学校,这样我们的房产才能增值。对于美国的老百姓而言,每一年只拿出1.38%的钱,就可以透过政府享受到这么多的福利,而这么多的福利是我个人做不到,必须透过政府的公权力,让所有社区的人同时交地产税,然后才能够达到环境、治安、教育改善的目的。所以,美国房产税是为了让房产升值,从而藏富于民。而我们的学者却提议透过房产税打压房价,他们简直连基本观念都没有搞懂。我过去讲到这些学者会很愤怒,不过现在我也不会了,跟他们计较什么呢?这么多可怜的人,就靠着胡说八道混口饭吃,算了算了,别跟他们计较了,反正他们讲话也没人听,对不对?
你知道美国是怎么征收房产税的吗?是由居民公选最诚实敬业的人做房产评估员。一般是两个不相识的人上门共同做评估,测量房屋的面积,登记房屋的数量,包括有多少个浴室,等等。然后登记完之后,两个人分别做评估,然后全部上网公开。居民能够查到所有的资料。如果认为过高的话,可以找评论员来理论,评论员会详细介绍评估的方法。比如说面积、年份的问题,还要考虑到结构的问题,建筑商的问题,还有类似房子的成交价格问题,等等。如果老百姓还是不满意,可以向州评估委员会上诉。那我请问你,这在中国能做得到吗?在中国由谁来评估?肯定又是政府官员。这简直是在平白增加贪污腐败的机会。为了让他评估低一点,给他一点钱,是不是就给了他腐败的机会?而且就算是我们引入美国的制度,找了两个人一起来评估。我相信评估完一次以后,两个人就开始勾结了。如果我们老百姓对评估不满,怎么申诉呢?是不是再去信访办?信访办申诉多了,把你给抓起来打一顿有没有可能?当然有可能,我们有些地方政府这种坏事少干了吗?在这样的环境下,你怎么公正、透明地评估房地产?如果评估不了如何收税呢?而且收了税之后,政府怎么用这个钱?到最后又是一笔糊涂账,拿去公款吃喝、出国旅游、贪污腐败了。我请问老百姓,你愿意交吗?听我讲到这儿,读者应该明白了,我们中国根本就没有征收房产税的条件。为什么?因为我们根本就没有一个公正、透明的评估机制。我们只要找官员来评估,就立刻会产生腐败,而且我们连申诉的机会都没有,除非你不怕挨揍。

2011年1月4日星期二

Office2007扩展Ribbon界面

参考资料:
http://sourcedaddy.com/ms-excel/customizing-existing-tab.html
http://openxmldeveloper.org/articles/customuieditor.aspx
具体过程两篇参考文献中都有,这里只讲要点:
1. 在什么文件中扩展Ribbon?
If you only want the custom Ribbon interface available for a specific document, create a macro-enabled document (.docm, .xlsm, or .pptm).
  • If you want the custom Ribbon interface available only for any document based on a particular template, create a macro-enabled template (.dotm, .xltm, or .potm).
  • If you want the custom Ribbon interface available for any open document in Word, modify the Normal template.
  • If you want the custom Ribbon interface available for any open document in Excel or PowerPoint, you need to create an Add-in file (.xlam or .ppam).
2. Office2007的文件格式实际是一个标准zip文件,可以通过修改扩展名后进行文件的添加、删除和修改
3. CustomUI Editor可以简化扩展的过程,包括图标
4. CustomUI Editor不支持中文,因此需要从文档包中把CustomUI.xml取出来,输入中文,保存时选择为unicode编码(UTF-8),然后去替代文档包中的该UI配置文件
5.图标的添加,如果是自定义文件图标的话,应该用image而不是imageMso
附件解压缩后是一个制作好的xlam文件,将其放到用户目录的\AppData\Roaming\Microsoft\AddIns下,并在Excel选项中启用该Add-in即可生效

http://u.115.com/file/f0b4513719

打印机无法删除

一种原因是有打印任务没完成,可以采用下面的方法解决

第一步:停止打印机服务,在控制面板–管理工具–服务–Print Spooler停止了这个服务。

第二步:开始菜单–运行(输入spool)回车,在spool文件夹打开”PRINTERS“文件,把这里面的文件都删除,然后按照第一步启动Print Spooler服务。这是在打印就恢复正常了,但是在打印机还显示有打印任务,这是重启下电脑,一切就恢复正常了。

打印机任务无法删除,就是按照这个方法解决了,如果用 bat执行文件也可以解决,而且代码简单方便。代码如下:

NET STOP SPOOLER
DEL C:\WINDOWS\SYSTEM32\SPOOL\PRINTERS\*.* /F /Q
NET START SPOOLER

2011年1月3日星期一

锐捷交换机关闭流控

锐捷S2026在出厂时默认打开了流控,sh run看不到这个配置

在机房机器网络同传时速度只有20多MB每分钟,一个机房要安装24小时。下面的命令用来关闭流控功能

int ran fa0/1-24
no sto uni
no sto mul
no sto bro
flo off