June 2013 Blog Posts

MySql用户权限配置管理--查看,赋予,回收(GRANT,REVOKE)

MitchellChu 2013-06-19 其他技术 编程语言

  用户管理使用CREATE USER,DROP USER,RENAME USER,SET PASSWORD等语法来完成,而MySql中用户中大部分都可以使用GRANT(赋予权限)和REVOKE(撤销权限)这两个语法来操作。其中,需要注意的是GRANT语句来赋予权限时,当被赋予权限的用户在系统中不存在时,会创建该用户,而后对该用户进行权限赋予。而REVOKE语句用来权限回收(撤销权限)时,即使被操作的用户所有的权限都被回收,但该用户并不会删除,要删除用户,请使用DROP USER或者直接到mysql.user中删除该用户。

  

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name

user_specification:
    user [IDENTIFIED BY [PASSWORD] 'password']

ssl_option:
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'

with_option:
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

  看起来有点复杂,对吧,这是标准的帮助文档,我们简而言之,一般语法格式是这样的:

-- GRANT基本的权限赋予语法
GRANT 权限类型1 [(要赋予的对象,列列表)][, 权限类型2[(要赋予的对象,列列表)]]...  ON [对象类型] 权限级别 TO 用户1 IDENTIFIED BY '密码' [, 用户2 IDENTIFIED BY '密码' ]...

-- 中括号内的可以忽略。

这样是不是清楚很多,其中GRANT能够赋予的权限类型有以下这些(Tips:注意ALL PRIVILEGES):

权限 意义
ALL [PRIVILEGES] 设置除GRANT OPTION之外的所有简单权限
ALTER 允许使用ALTER TABLE
ALTER ROUTINE 更改或取消已存储的子程序
CREATE 允许使用CREATE TABLE
CREATE ROUTINE 创建已存储的子程序
CREATE TEMPORARY TABLES 允许使用CREATE TEMPORARY TABLE
CREATE USER 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW 允许使用CREATE VIEW
DELETE 允许使用DELETE
DROP 允许使用DROP TABLE
EXECUTE 允许用户运行已存储的子程序
FILE 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX 允许使用CREATE INDEX和DROP INDEX
INSERT 允许使用INSERT
LOCK TABLES 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS 允许使用SHOW FULL PROCESSLIST
REFERENCES 未被实施
RELOAD 允许使用FLUSH
REPLICATION CLIENT 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT 允许使用SELECT
SHOW DATABASES SHOW DATABASES显示所有数据库
SHOW VIEW 允许使用SHOW CREATE VIEW
SHUTDOWN 允许使用mysqladmin shutdown
SUPER 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE 允许使用UPDATE
USAGE “无权限”的同义词
GRANT OPTION 允许授予权限

来栗子才能吃饱,没例子,没真相,下面我们使用几个简单的GRANT语句来为特定用户赋予权限:

/*
===================================================
; blog.useasp.net
; Mitchell Chu
; MySql用户权限配置管理
; GRANT 语法示例
; 下面语法并不是一起的,每个示例为单独说明某一问题而存在
===================================================
*/

-- 1.赋予someuser@somehost这个用户全局所有权限
-- 如果用户不存在,创建该用户,但该用户没有密码
-- 所以这样使用需要特别慎重
GRANT ALL ON *.* TO 'someuser'@'somehost';

-- 2.赋予someuser@somehost这个用户在myDatabase上所有权限
-- 如果用户不存在,创建该用户,但该用户没有密码
-- 所以这样使用需要特别慎重
GRANT ALL ON myDatabase.* TO 'someuser'@'somehost';

-- 3.赋予someuser@somehost这个用户在myDatabase上的所有权限
--  如果用户不存在,则创建用户,密码为:somepassword
GRANT ALL ON myDatabasse.* TO 'someuser'@'somehost' IDENTIFIED BY 'somepassword';

-- 4. 赋予someuser@somehost这个用户在myDatabase上的权限
-- 该用户仅有SELECT和INSERT权限
GRANT SELECT, INSERT ON myDatabase.* TO 'someuser'@'somehost';

-- 5. 赋予someuser@somehost这个用户在myDatabase上myTbl表的权限
-- 该用户仅有myDatabase。myTbl上的SELECT和INSERT权限
GRANT SELECT, INSERT ON myDatabase.myTbl TO 'someuser'@'somehost';

-- 6. 赋予someuser@somehost这个用户在myDatabase上myTbl表的权限
-- 该用户仅有myDatabase.myTbl上某些列上有权限:
-- myTbl的colName1有SELECT和INSERT权限
-- myTbl的colName2只有INSERT权限
GRANT SELECT (colName1), INSERT(ColName1,ColName2) ON myDatabase.myTbl TO 'someuser'@'somehost';

怎么样,权限粒度可大可小吧,大至全局,小至单列,设置运用都能自如,很有成就感吧?不过需要注意,权限设置完毕之后,如果要马上生效,记得FLUSH PRIVILEGES一下哦。

REVOKE 作为权限撤消语句,和GRANT语句匹配,自然使用的权限列表和GRANT要一样。是:

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] ...

如果你和我一样,对官方文档中复杂的语法结构描述相当头疼,那么可以看看下面REVOKE常用的语法格式就好了,当然,这只是为了快速理解语法,如果在实际使用中,碰到实际问题,建议还是要深读官方晦涩的标准文档的:

REVOKE 权限类型1[(回收权限的列对象列表)], 权限类型2[(要回收权限的列对象列表)]... ON [对象类型] 权限级别 FROM 要回收权限的用户1 [,要回收权限的用户2]..

REVOKE直接回收FROM后面的用户的权限,要咋回收,就要靠ON指定回收区域,而后REVOKE在根据要回收的权限类型,在这个区域进行回收用户的权限。如果你要回收某用户的所有权限,那么可以简单的使用下面这样的语句:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 要回收权限的用户

 为什么要ALL PRIVILEGES之后还要GRANT OPTION? —— 请参见前面的权限列表哦。

好了,来几个例子享受下:

/*
===================================================
; blog.useasp.net
; Mitchell Chu
; MySql用户权限配置管理
; REVOKE 语法示例
; 下面语法并不是一起的,每个示例为单独说明某一问题而存在
===================================================
*/
-- 1.回收someuser@somehost这个用户所有权限
-- 注意: REVOKE并不会删除用户,即使权限被你扒光
-- 另外:如果你没有指定@后面的host,默认是使用%
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'someuser'@'somehost';

-- 2.回收someuser@somehost这个用户在myDatabase上的DROP权限
REVOKE DROP ON myDatabase.* FROM 'someuser'@'somehost';

-- 3.更多示例 —— 没有更多了
-- 请参见GRANT中的信息,自己自由组合:D

 记住:在回收完用户权限之后,如果是要删除用户,还需要DROP USER或者到mysql.user中DELETE 一下,不然用户还存在的。要立即生效,也要记得FLUSH PRIVILEGES哦。为什么要使用FLUSH PRIVILEGES?这个是告诉系统,我们已经更改了权限,请你清除缓存,重新到用户权限表中获取新的权限的意思。

说了上面这么一些,有人就要问了,我该怎么知道现在某个用户有什么权限呢?Good question!这个问题也困扰了菜鸟级的我,后来才发现,应该使用的是,语法如下:

SHOW GRANTS FOR user;

user就是你要查看权限的用户,如果你不使用@host的方式,默认host是%。如果要查看当前登录用户的权限你就可以使用下面这些语句中的任意一个了:

SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();

 而如果你是要查看当前系统下,所有用户的权限分配情况,怎么处理呢?可以试试下面的语句:

/*
===================================================
; blog.useasp.net
; Mitchell Chu
; MySql用户权限配置管理
; SHOW GRANTS 语法示例
; 下面语法并不是一起的,每个示例为单独说明某一问题而存在
===================================================
*/

-- 如果是Linux下,可参照下面的语句,也可参照Windows下的写法,带上其他参数.
mysql -Bse "SELECT DISTINCT CONCAT('SHOW GRANTS FOR \'', user ,'\'@\'', host, '\';') FROM mysql.user" | mysql -Bs | sed 's/$/;/g'

-- Windows下,用下面的方法试试咯,没有sed嘛
mysql -Bse "SELECT DISTINCT CONCAT('SHOW GRANTS FOR \'', user, '\'@\'', host, '\';') FROM mysql.user" -uroot -p |mysql -Bs -uroot -p

 怎么样,所有的用户权限都出来了吧。

国外流行的购物搜索引擎和购物比价网站

MitchellChu 2013-06-18 网络锁事

  MitchellChu今日走马观花了一下国外比较流行的,列出来做个记录——让自己记得,咱还看过这玩意儿!

编号 网站 描述
1 Google Google旗下的产品搜索引擎。本人身为伟大兲朝的臣民,竟然不给访问,强烈抗议啊!
2 pricegrabber.com 电子产品居多,涉及服饰,厨卫,图书,珠宝,本地服务等等,覆盖面比较广,3M~4M/M的访问
3 nextag.com 专注比价,涉及的产品种类繁多,服饰,电子产品,珠宝等等,功能上某淘和惠惠都可能是这个网站的亲戚。
4 Shopping.com 购物搜索,家居,电子产品,服饰……有个社区
5 shopzilla.com 好多东西都来自ebay。
6 Become.com 购物体验应该不错,用分类导购的方式,弱化搜索功能。
7 Bing Shopping 也和Google一样,歧视我伟大兲朝。几经周折方得上去。搜索的结果比较杂乱。
8 Pronto.com 分类多,男人/女人/小孩的用品都有,这个分类倒不失方便性,恩,还有个药店产品类目。
9 TheFind.com 关注了一段时间,首页变化挺多挺大的,难道还在找自己的Style吗?网站搜索方式比较新颖。提供本地商店搜索。
10 Amazon Product 这个……
11 BizRate.com 类目齐全,比较倒是和前面shopzilla类似
12 shoplocal.com 好吧,人家的目标是本地搜索,为顾客省钱而生的。和普通的购物搜索还是有很大差别的。
13 slickdeals.net 能有个com域名么?在兲朝访问慢啊。上去好像和购物搜索没什么太大关系,谁说他是购物搜索引擎的?
14 woot.com 搜索引擎就算了,不过比较购物还是靠谱的。
15 coupons.com 从域名中,你就应该看出人家是干什么的了,霸气侧漏啊。
16 ShopAtHome.com 优惠券,网店,网站内容,都能搜,当然这不是重点,重点是带返利的。
17 smarter.com 中国也有个『聪明点』,当然两个好像不是一家人,提供的分类全面,搜索有比价的时候比价,并会给出推荐。
18 fatwallet.com 优惠券,返利,优惠产品,芝加哥本地,还有个论坛。
19 DealTime.com 服饰,电子产品,家居,图书……等分类,特色是能够在搜索的时候明确了解当前产品的优惠幅度,筛选分类略显不足。
20 DealNews 涵盖电脑,服饰,电子产品,旅游,本地服务,同时还有编辑推荐。
21 Yahoo! Shopping 美国和日本提供两个不同的网站内容。但都是作为搜索引擎出现。

多种.NET下禁用或启用Windows网卡的方法讨论

MitchellChu 2013-06-17 .NET技术

.NET教程:C#禁用启用Windows网卡的方法  查资料查的好辛苦啊,还好,找好了。这不,又要来当回『孔乙己』了,孔老湿当年是非常喜欢研究『茴』字的多种写法的,我呢也比较喜欢研究程序中各个功能的多种实现方法的。咳咳……嗯…… 这个下禁用/启用网卡是有很多种方法滴,你知道这个禁用/启用有几种方法呢,在.NET怎么写么?话说,我就是这么把自己套进去了,不过话说回来,还真给找到有好几种方法可以实现这个禁用/启用网卡的功能,不过实现方法却并不是每种都能够在你的机器下运行起来的。让我们来看看吧。

  首先,第一种方法,网站上流传还是比较广的,中文内容到处非常多贴着这个代码来讨论如何/启用网卡的。这么悬乎,是什么方法?查查:C# 启用或禁用网卡,应该出镜率不是第一就是第二了吧,Here we go, 上代码:

/*
* blog.useasp.net
* MitchellChu's Blog
* 网卡的禁用/启用方法
*
* 要在项目中使用此方法,你必须添加对Shell32的引用。
* enable: 是bool值,表示网卡的启用或禁用,false 禁用
* networkConnectionName:网卡显示的名称,一般是:本地连接,本地连接 2这样的。
*/

public static bool ChangeNetworkConnectionStatus(bool enable, string networkConnectionName)
{
    const string discVerb = "停用(&B)"; // "停用(&B)"; 
    const string connVerb = "启用(&A)"; // "启用(&A)"; 
    const string network = "网络连接"; //"网络连接"; 

    string sVerb = enable ? connVerb : discVerb;

    Shell sh = new Shell(); //Shell32.Shell()
    Folder folder = sh.NameSpace(Shell32.ShellSpecialFolderConstants.ssfCONTROLS);

    try
    {
        //进入控制面板的所有选项 
        foreach (FolderItem myItem in folder.Items())
        {
            //进入网络连接 
            if (myItem.Name == network)
            {
                Folder fd = (Shell32.Folder)myItem.GetFolder;
                foreach (FolderItem fi in fd.Items())
                {
                    //找到本地连接 
                    Console.WriteLine(fi.Name);
                    if ((fi.Name == networkConnectionName))
                    {
                        //找本地连接的所有右键功能菜单 
                        foreach (FolderItemVerb Fib in fi.Verbs())
                        {
                            Console.WriteLine(Fib.Name);
                            if (Fib.Name == sVerb)
                            {
                                Fib.DoIt();
                                return true; //仅此返回true
                            }
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
        return false;
    }
    return false; //没有处理成功
}

 这个方法的原理是使用Shell32里面的方法,从控制面板一路查找到要禁用或的右键方法,然后指定指定操作。查找路径如下:

控制面板->网络连接->要查找的网卡->该网卡的右键菜单->调用启用或禁用操作

这个方法的优势是他的确能够实现网卡的禁用和启用,不过劣势就非常多了:

  1. 硬编码,换个环境,改代码吧;
  2. 模拟人的搜索链接方式,系统模式变了,改代码吧;
  3. 兼容性非常的差,至少本人在Win7,Windows2003下都没有正常的运行起来。在Win7下面,控制面板中压根就找不到网络连接(25行),这也就说明第二点,系统模式变了,没招。Windows2003下使用是在38行异常:内存位置访问无效。 (异常来自 HRESULT:0x800703E6)。
  4. 我想这个方法是不是只在XP能够运行? —— 这个没有找到支持的证据,因为官网的说明是最小支持平台是XP和2000 Pro,而之后的2003和Win7都不能用。所以只还猜测只能在XP下用了。

 

第二种方法:使用WMI来操作网卡的禁用/启用,同样,上代码再说:

/*
* blog.useasp.net
* MitchellChu's Blog
* 网卡的禁用/启用方法
*
* 要在项目中使用此方法,你必须添加对System.Management的引用。
* enable: 是bool值,表示网卡的启用或禁用,false 禁用
* networkConnectionName:网卡显示的名称,一般是:本地连接,本地连接 2这样的。
*/

public bool ChangeNetworkConnectionStatus(bool enable, string networkConnectionName)
{
    uint retRslt = 1;
    using (ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter=TRUE AND NetConnectionID='" + networkConnectionName + "'"))
    {
        foreach (ManagementObject mbo in mos.Get())
        {
            retRslt = (uint)(enable ? mbo.InvokeMethod("Enable", null) : mbo.InvokeMethod("Disable", null));
            if (retRslt != 0) break;
        }
        if (retRslt == 0)
            return true;
        return false;
    }
}

 这个方法的使用原理就是通过调用WMI中Win32_NetworkAdapter的两个方法来实现禁用和启用网卡的,这个方法和前一个方法相比,简洁了许多,实现起来也更优雅一些,毕竟再也不用硬编码了。不过细心的你应该会发现,网上也有好多人抱怨,这玩意怎么用不了;或者你解决类似网卡的启用禁用问题,你也会发下,这个方法在WIn7神码的跑的非常的欢快,不过到了Windows2003啥的,就对不起了,罢工!

  至于调用WMI中Win32_NetworkAdapter的Enable和Disable方法出错的问题,我们可以在官方网站上找到答案。官方网站明确给出:Win32_NetworkAdapter中Diable和Enable两个方法,支持的最早平台是Windows Vista或者Windows Server 2008,而且是desktop apps only的,明白了吗?这就是为什么你调用Disble或Enable的时候死活不能成功的原因了。如果你碰到这个问题,好好想想其他办法吧,此路不通!至于有人说,我的是Windows 8啊,怎么也会报错?咳咳……管理员权限给了么亲?

  以上这两种方法是当下网络中比较流行的方法,然而却各有限制。在实际的使用中,如果是二选一,个人比较推荐后者。

 

第三种方法:既然前面的方法都有或多或少的问题,那么我们就转到命令行下来试试吧。看个代码先:

/*
* blog.useasp.net
* MitchellChu's Blog
* 网卡的禁用/启用方法
*
* 要在项目中使用此方法,你必须添加对System.Diagnostics的引用。
* enable: 是bool值,表示网卡的启用或禁用,false 禁用
* networkConnectionID:网卡显示的名称,一般是:本地连接,本地连接 2这样的。
*/

public bool ChangeNetworkConnectionStatus(bool enable, string networkConnectionID)
{
    using (Process process = new Process())
    {
        string cmdParameter = "{0} = net PCI\{1}";
        process.EnableRaisingEvents = false;
        process.StartInfo.Arguments = String.Format(cmdParameter, enable ? "enable" : "disable", networkConnectionID);
        process.StartInfo.FileName = "devcon.exe";
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.ErrorDialog = false;
        process.StartInfo.RedirectStandardError = false;
        process.StartInfo.RedirectStandardInput = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.Start();
        string rtn = process.StandardOutput.ReadToEnd();
        if (rtn.Trim().Length == 0)
        {
        	return true;
        }
        else
        {
            return false;
        }
    }
}

这种方法使用的是devcon.exe来实现网卡的禁用和启用的,DevCon 实用工具是一种命令行实用工具,可以替代设备管理器。使用 DevCon,您可以启用、禁用、重新启动、更新、删除和查询单个设备或一组设备。DevCon 还提供与驱动程序开发人员有关、但无法在设备管理器中看到的信息。不过这个工具不是系统自带的,需要单独下载(下载地址官方文档)。这个工具的好处是支持Windows XP ,Wndows 2000,Windows 2003的各个版本,在XP之前的95,95,ME不受支持,在2003之后的系统暂时未知,Win7没有仔细测试,可以获取。这个应该算是devcon的劣势了,不过比起前面两个,它有个优势,就是能随程序一起发布,这点也算比较方便了。

 

第四种方法:同样是命令行中来实现,只不过使用了另外一个命令:netsh。

/*
* blog.useasp.net
* MitchellChu's Blog
* 网卡的禁用/启用方法
*
* 要在项目中使用此方法,你必须添加对System.Diagnostics的引用。
* enable: 是bool值,表示网卡的启用或禁用,false 禁用
* networkConnectionName:网卡显示的名称,一般是:本地连接,本地连接 2这样的。
*/

public bool ChangeNetworkConnectionStatus(bool enable, string networkConnectionName)
{
    using (Process process = new Process())
    {
        string netshCmd = "interface set interface name=\"{0}\" admin={1}";
        process.EnableRaisingEvents = false;
        process.StartInfo.Arguments = String.Format(netshCmd, networkConnectionName, enable ? "ENABLED" : "DISABLED");
        process.StartInfo.FileName = "netsh.exe";
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.ErrorDialog = false;
        process.StartInfo.RedirectStandardError = false;
        process.StartInfo.RedirectStandardInput = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.Start();
        string rtn = process.StandardOutput.ReadToEnd();
        if (rtn.Trim().Length == 0)
        {
        	return true;
        }
        else
        {
            return false;
        }
    }
}

这个禁用,启用windows网卡的方法是使用命令行的netsh命令来实现的,Netsh 是命令行脚本实用工具,它允许从本地或远程显示或修改当前正在运行的计算机的网络配置。而且此君武功了得,基本上有经验的管理员都得到过此君的帮助。更重要的是,用netsh这个命令行来执行启用或禁用网卡这事,本来就是它职责范围内的,所以,netsh驾轻就熟,非常方便就能搞定。netsh支持的平台据我了解应该是XP——?,XP之前的没有了解过。

  到这里,我就已经倾囊而出了,这『茴』字也就这么几个写法了,你还有其他什么『写法』吗?MitchellChu非常欢迎你一起来讨论下。

 

Windows虚拟主机权限设置批处理bat

MitchellChu 2013-06-17 其他技术

  这是一个来源于网络上的服务器下的权限配置批处理脚本,脚本在交互上的设计也比较好(当年用的权限配置bat一运行就巴拉巴拉的自个玩去了,都不知道执行到什么地方了)。在这里非常感谢作者们的无私分享。

  这个权限设置仅针对的是Windows下IIS服务器的,并不是放之四海皆能的万能的权限配置,同时需要注意的是,这个文件中使用的权限设置批处理脚本并不一定适合所有人,IIS_WGP就我知道的很多服务器上并没有使用。在切换到自己的生产环境中,需要先进行评估自己服务器上的安全水平之后在酌情修改。千万不要一拿到脚本直接放到生产环境运行,之后就不闻不问了,等回头出现了安全隐患就回来骂娘哦。

@ECHO OFF
SETLOCAL

REM
REM CHANGELOG --
REM by amxku&自在轮回, C.Rufus S.T
REM 2006-12-10

REM add some tips ;)
REM by amxku, C.Rufus S.T
REM 2007-07-10

REM VH_Gh0st For IIS V1.4
REM 鬼仔说被权限弄挂过一次,所以加个还原的 ;)
REM by amxku, C.Rufus S.T
REM 2008-06-23

TITLE VH_Gh0st For IIS V1.4 - 红狼安全小组
ECHO.
ECHO "+++++++++++++++++++++++++++++++++++++"
ECHO "+  VH_Gh0st For IIS V1.4            +"
ECHO "+  虚拟主机C盘权限设置[IIS] V1.4    +" 
ECHO "+                                   +"
ECHO "+  www.wolfexp.net                  +"
ECHO "+  红狼安全小组                     +"
ECHO "+                                   +"
ECHO "+  amxku   自在轮回                 +"
ECHO "+++++++++++++++++++++++++++++++++++++"
:menu
ECHO.
ECHO [1]     删除C盘的everyone的权限
ECHO [2]     删除C盘的所有的users的访问权限
ECHO [3]     添加iis_wpg的访问权限
ECHO [4]     添加iis_wpg的访问权限[.net专用]
ECHO [5]     添加iis_wpg的访问权限[装了MACFEE的软件专用]
ECHO [6]     添加users的访问权限
ECHO [7]     删除C盘Windows下的所有的危险文件夹
ECHO [8]     删除系统危险文件的访问权限,只留管理组成员
ECHO [9]     注册表相关设定
ECHO [10]    将C盘权限还原为默认[需重启]
ECHO [0]     退出
ECHO.
@ECHO 请选择?
@ECHO 输入上面的选项回车
@ECHO off
set /p menu=

if %menu% == 0 GOTO exit
if %menu% == 1 GOTO 1
if %menu% == 2 GOTO 2
if %menu% == 3 GOTO 3
if %menu% == 4 GOTO 4
if %menu% == 5 GOTO 5
if %menu% == 6 GOTO 6
if %menu% == 7 GOTO 7
if %menu% == 8 GOTO 8
if %menu% == 9 GOTO 9
if %menu% == 10 GOTO 10

:1
ECHO 删除C盘的everyone的权限 
CACLS "%SystemDrive%" /R "CREATOR OWNER" /E
CACLS "%SystemDrive%" /R "everyone" /E 
CACLS "%SystemRoot%" /R "everyone" /E 
CACLS "%SystemDrive%/Documents and Settings" /R "everyone" /E 
CACLS "%SystemDrive%/Documents and Settings/All Users" /R "everyone" /E 
CACLS "%SystemDrive%/Documents and Settings/All Users/Documents"  /R "everyone" /E 
ECHO.
ECHO 删除C盘的everyone的权限 ………………ok!
ECHO.
GOTO menu

:2
ECHO 删除C盘的所有的users的访问权限 
CACLS "%SystemDrive%" /R "users" /E 
CACLS "%SystemDrive%/Program Files" /R "users" /E 
CACLS "%SystemDrive%/Documents and Settings" /R "users" /E 
CACLS "%SystemRoot%" /R "users" /E 
CACLS "%SystemRoot%/addins" /R "users" /E 
CACLS "%SystemRoot%/AppPatch" /R "users" /E 
CACLS "%SystemRoot%/Connection Wizard" /R "users" /E 
CACLS "%SystemRoot%/Debug" /R "users" /E 
CACLS "%SystemRoot%/Driver Cache" /R "users" /E 
CACLS "%SystemRoot%/Help" /R "users" /E 
CACLS "%SystemRoot%/IIS Temporary Compressed Files" /R "users" /E 
CACLS "%SystemRoot%/java" /R "users" /E 
CACLS "%SystemRoot%/msagent" /R "users" /E 
CACLS "%SystemRoot%/mui" /R "users" /E 
CACLS "%SystemRoot%/repair" /R "users" /E 
CACLS "%SystemRoot%/Resources" /R "users" /E 
CACLS "%SystemRoot%/security" /R "users" /E 
CACLS "%SystemRoot%/system" /R "users" /E 
CACLS "%SystemRoot%/TAPI" /R "users" /E 
CACLS "%SystemRoot%/Temp" /R "users" /E 
CACLS "%SystemRoot%/twain_32" /R "users" /E 
CACLS "%SystemRoot%/Web" /R "users" /E 
CACLS "%SystemRoot%/WinSxS" /R "users" /E 
CACLS "%SystemRoot%/system32/3com_dmi" /R "users" /E 
CACLS "%SystemRoot%/system32/administration" /R "users" /E 
CACLS "%SystemRoot%/system32/Cache" /R "users" /E 
CACLS "%SystemRoot%/system32/CatRoot2" /R "users" /E 
CACLS "%SystemRoot%/system32/Com" /R "users" /E 
CACLS "%SystemRoot%/system32/config" /R "users" /E 
CACLS "%SystemRoot%/system32/dhcp" /R "users" /E 
CACLS "%SystemRoot%/system32/drivers" /R "users" /E 
CACLS "%SystemRoot%/system32/export" /R "users" /E 
CACLS "%SystemRoot%/system32/icsxml" /R "users" /E 
CACLS "%SystemRoot%/system32/lls" /R "users" /E 
CACLS "%SystemRoot%/system32/LogFiles" /R "users" /E 
CACLS "%SystemRoot%/system32/MicrosoftPassport" /R "users" /E 
CACLS "%SystemRoot%/system32/mui" /R "users" /E 
CACLS "%SystemRoot%/system32/oobe" /R "users" /E 
CACLS "%SystemRoot%/system32/ShellExt" /R "users" /E 
CACLS "%SystemRoot%/system32/wbem" /R "users" /E 
ECHO.
ECHO 删除C盘的所有的users的访问权限  ………………ok!
ECHO.
GOTO menu


:7
ECHO 删除C盘Windows下的所有的危险文件夹 
ATTRIB %SystemRoot%/Web/printers -S -R -H
DEL %SystemRoot%\Web\printers\*.* /S /Q /F
RD %SystemRoot%\Web\printers /S /Q

ATTRIB %SystemRoot%\Help\iisHelp -S -R -H
DEL %SystemRoot%\Help\iisHelp\*.* /S /Q /F
RD %SystemRoot%\Help\iisHelp /S /Q

ATTRIB %SystemRoot%\system32\inetsrv\iisadmpwd -S -R -H
DEL %SystemRoot%\system32\inetsrv\iisadmpwd\*.* /S /Q /F
RD %SystemRoot%\system32\inetsrv\iisadmpwd /S /Q
ECHO.
ECHO 删除C盘Windows下的所有的危险文件夹   ………………ok!
ECHO.
GOTO menu


:8
ECHO 给系统危险文件设置权限设定
CACLS "C:\boot.ini" /T /C /E /G Administrators:F
CACLS "C:\boot.ini" /D Guests:F /E

CACLS "C:\AUTOEXEC.BAT" /T /C /E /G Administrators:F
CACLS "C:\AUTOEXEC.BAT" /D Guests:F /E

CACLS "%SystemRoot%/system32/net.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/net.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/net1.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/net1.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/cmd.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/cmd.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/ftp.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/ftp.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/netstat.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/netstat.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/regedit.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/regedit.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/at.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/at.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/ATTRIB.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/ATTRIB.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/format.com" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/format.com" /D Guests:F /E

CACLS "%SystemRoot%/system32/logoff.exe" /T /C /E /G Administrators:F

CACLS "%SystemRoot%/system32/shutdown.exe" /G Administrators:F
CACLS "%SystemRoot%/system32/shutdown.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/telnet.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/telnet.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/wscript.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/wscript.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/doskey.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/doskey.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/help.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/help.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/ipconfig.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/ipconfig.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/nbtstat.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/nbtstat.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/print.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/print.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/xcopy.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/xcopy.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/edit.com" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/edit.com" /D Guests:F /E

CACLS "%SystemRoot%/system32/regedt32.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/regedt32.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/reg.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/reg.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/register.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/register.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/replace.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/replace.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/nwscript.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/nwscript.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/share.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/share.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/ping.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/ping.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/ipsec6.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/ipsec6.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/netsh.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/netsh.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/debug.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/debug.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/route.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/route.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/tracert.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/tracert.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/powercfg.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/powercfg.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/nslookup.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/nslookup.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/arp.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/arp.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/rsh.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/rsh.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/netdde.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/netdde.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/mshta.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/mshta.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/mountvol.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/mountvol.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/tftp.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/tftp.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/setx.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/setx.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/find.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/find.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/finger.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/finger.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/where.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/where.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/regsvr32.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/regsvr32.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/CACLS.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/CACLS.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/sc.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/sc.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/shadow.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/shadow.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/runas.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/runas.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/wshom.ocx" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/wshom.ocx" /D Guests:F /E

CACLS "%SystemRoot%/system32/wshext.dll" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/wshext.dll" /D Guests:F /E

CACLS "%SystemRoot%/system32/shell32.dll" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/shell32.dll" /D Guests:F /E

CACLS "%SystemRoot%/system32/zipfldr.dll" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/zipfldr.dll" /D Guests:F /E

CACLS "%SystemRoot%/PCHealth/HelpCtr/Binaries/msconfig.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/PCHealth/HelpCtr/Binaries/msconfig.exe" /D Guests:F /E

CACLS "%SystemRoot%/notepad.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/notepad.exe" /D Guests:F /E

CACLS "%SystemRoot%/regedit.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/regedit.exe" /D Guests:F /E

CACLS "%SystemRoot%/winhelp.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/winhelp.exe" /D Guests:F /E

CACLS "%SystemRoot%/winhlp32.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/winhlp32.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/notepad.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/notepad.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/edlin.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/edlin.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/posix.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/posix.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/atsvc.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/atsvc.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/qbasic.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/qbasic.exe" /T /C /E /G Administrators:F

CACLS "%SystemRoot%/system32/runonce.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/runonce.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/syskey.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/syskey.exe" /D Guests:F /E

CACLS "%SystemRoot%/system32/cscript.exe" /T /C /E /G Administrators:F
CACLS "%SystemRoot%/system32/cscript.exe" /D Guests:F /E
ECHO.
ECHO 给系统危险文件设置权限设定   ………………ok!
ECHO.
GOTO menu

:9
ECHO 注册表相关设定
REG DELETE HKEY_CLASSES_ROOT\WScript.Shell /f
REG DELETE HKEY_CLASSES_ROOT\WScript.Shell.1 /f
REG DELETE HKEY_CLASSES_ROOT\Shell.application /f
REG DELETE HKEY_CLASSES_ROOT\Shell.application.1 /f
REG DELETE HKEY_CLASSES_ROOT\WSCRIPT.NETWORK /f
REG DELETE HKEY_CLASSES_ROOT\WSCRIPT.NETWORK.1 /f
regsvr32 /s /u wshom.ocx
regsvr32 /s /u wshext.dll
regsvr32 /s /u shell32.dll
regsvr32 /s /u zipfldr.dll
ECHO.
ECHO 注册表相关设定   ………………ok!
ECHO.
GOTO menu


:3
ECHO 添加iis_wpg的访问权限 
CACLS "%SystemRoot%" /G iis_wpg:R /E 
CACLS "%SystemDrive%/Program Files/Common Files" /G iis_wpg:R /E 

CACLS "%SystemRoot%/Downloaded Program Files" /G iis_wpg:C /E 
CACLS "%SystemRoot%/Help" /G iis_wpg:C /E 
CACLS "%SystemRoot%/IIS Temporary Compressed Files" /G iis_wpg:C /E 
CACLS "%SystemRoot%/Offline Web Pages" /G iis_wpg:C /E 
CACLS "%SystemRoot%/System32" /G iis_wpg:C /E 
CACLS "%SystemRoot%/Tasks" /G iis_wpg:C /E 
CACLS "%SystemRoot%/Temp" /G iis_wpg:C /E 
CACLS "%SystemRoot%/Web" /G iis_wpg:C /E 
ECHO.
ECHO 添加iis_wpg的访问权限   ………………ok!
ECHO.
GOTO menu


:4
ECHO 添加iis_wpg的访问权限[.net专用] 
CACLS "%SystemRoot%/Assembly" /G iis_wpg:C /E 
CACLS "%SystemRoot%/Microsoft.NET" /G iis_wpg:C /E 
ECHO.
ECHO 添加iis_wpg的访问权限[.net专用]   ………………ok!
ECHO.
GOTO menu

:5
ECHO 添加iis_wpg的访问权限[装了MACFEE的软件专用] 
CACLS "%SystemDrive%/Program Files/Network Associates" /G iis_wpg:R /E 
ECHO.
ECHO 添加iis_wpg的访问权限[装了MACFEE的软件专用]   ………………ok!
ECHO.
GOTO menu

:6
ECHO 添加users的访问权限 
CACLS "%SystemRoot%/temp" /G users:C /E 
ECHO.
ECHO 添加users的访问权限   ………………ok!
ECHO.
GOTO menu

:10
ECHO 将C盘权限还原为默认 
Secedit /configure /db %SYSTEMROOT%\security\database\cvtfs.sdb /Cfg "%SYSTEMROOT%\security\templates\setup security.inf" /areas filestore
GOTO menu

:exit

EXIT

Windows下禁止超级用户关机和重启

MitchellChu 2013-06-17 其他技术

   下有的时候,为了能够实现机器多用户使用,我们会使用多个用户的方式来处理,而普通用户涉及到权限的时候,一般为了简便,会将用户直接放入Administrators组中。多个用户同时处理的时候,可能会碰到用户一不小心关机,导致其他用户受到不必要的损失,为了不使用户彼此不受干扰,我们可以,只能注销自己的当前账户。这样就比较好的保护了其他在线用户的资料完整性。

   设置方式,第一步,先禁用所有Administrators组的关闭系统权限,设置如下:

==========================================
http://blog.useasp.net/
MitchellChu's Blog
禁用Administrators组中用户的关机和重启功能
==========================================

控制面板->管理工具->本地安全策略->安全设置->本地策略->用户权限分配->关闭系统->右键:属性->删除Administrators->应用->注销所有Administrators组用户

   如果你要所有用户的关机重启功能,可以重复第一步,将属性中的所有账户或组删除,设置完毕之后,第二步,添加有关机权限的用户组或用户,设置方法仅是在第一步中属性对话框中点击:添加用户或组按钮进行添加。 

  

WMI中的SQL,WQL简明教程系列5:工具,命名空间,路径

MitchellChu 2013-06-17 .NET技术 其他技术 编程语言

MitchellChu:WMI WQL教程  的WQL简明教程系列的前四篇文章[1,2,3,4]完全介绍WQL的各个基本知识,相信对于WMI的WQL的开发来说,这些知识已经足够我们步入WMI的世界,并能准确的驾驭WQL中的各个使用细节了。这些掌控的所有细节,自然只有在实战中进行发挥,才能体现我们学习WMI的WQL的作用。在实际中使用,我们还需要一些辅助的工具来进行开发。WMI的基本知识就像是武功修练中的内功心法,我们练得非常的醇厚,自然可以徒手独步武林,但在我们还没有练到随心所欲,化腐朽为神奇的境界,选择个武器共创天地也不失是个好主意,同样的道理,在全然彻底的了解WMI中的方方面面的时候,工具神码都是浮云,而在我们未能做到这个之前,选择一些工具来帮助我们就显得非常重要了。

  由于MitchellChu也是初涉WMI不久,在WMI中的可能涉及不够全面,因此如果有不正确的地方,请各位不吝赐教。下面是用过的一些工具,以表格方式放出:

工具名称

描述

wbemtest.exe

系统自带的WMI测试器工具,你可以使用这个工具连接到相应的命名空间下进行查询等操作。

dcomcnfg.exe

该功能并非WMI的工具,而是通过该工具能够启动WMI服务(winmgmt)

wmimgmt.msc

wmi配置程序

wmic.exe

wmi命令行工具

WMITools.exe

非系统自带工具,是官方提供的WMI 工具集,安装后,能够提供WMI CIM Studio ,WMI Event Registration,WMI Event Viewer,WMI Object Browser等实用工具。该工具应该说是WMI开发中不可或缺的WMI工具。下载地址为:WMITools.exe或下载页:download

  上面这些工具只能够让我们选择和查看相应的WMI信息,如果需要用程序操作,在系统层面,WSH(Windows Scripts Host)就显得很重要了,WSH提供脚本引擎,一个是wscript.exe,另外一个是cscript.exe,两者都是能够针对.wsh,.vbs,.js进行解析,前者是windows窗口中运行,后者则是在命令行中运行。嗯嗯,偏题了,这是WMI的主题,那么更多的信息可以参见WSH网络上的解释。要说明的意思是,如果你有要操作的,可以用VBSCRIPT或者JScript来编写脚本,并在WSH中使用即可。当然,你还可以在其他程序中使用WMI,比如C++,.NET中,均可用编程的方式使用WQL来调用WMI中的CIM类或实例。

关于WMI命名空间:

用于对相同环境中存在的类进行分组,也用于加强安全限制。当请求连接到一个命名空间时会检查用户的权限,这决定命名空间级别的权限。命名空间是一个层次结构,类似文件系统中文件夹的层次结构。

WMI中常见的命名空间:

命名空间

描述

root

所有命名空间均在这个命名空间下,此命名空间只包含WMI系统类,这些类也会在其它命名空间中出现。(WMI系统类是在名称前面有两个下划线("_")组成,可以非常方便的查询)

root\Default

与windows注册表操作有关的主机类 ,读取、写入、枚举、监视、创建、删除注册表项和值。

root\Security

用于与windows安全有关的类

root\CIMV2

包含从CIM Schema派生的类,它们代表着我们最常工作的win32环境。比如:获取系统信息,管理 Windows 事件日志等

root\MicrosoftIISv2

 IIS WMI 提供程序。 .NET下管理 IIS的API在Microsoft.Web.Administration这个命名空间下。

root\RSOP 策略的结果集
root\Policy 组策略
root\directory\ldap Active Directory提供程序

有些朋友在网上找获取硬盘序列号的例子,一找说用WMI可以获取,可是代码中却要连接到root\CIMV2这个命名空间下,就非常不解,怎么要连这个命名空间呢?而好多写代码的也一知半解,不能给出完整的说明。其实这是因为微软将所有涉及到Win32系统的信息都集成在CIMV2的原因。

关于

千言万语不及代码一行:

;========================================
; http://blog.useasp.net/
; MitchellChu's Blog
; WMI tutorial
; WMI路径说明
;========================================
\\ComputerName\root\CIMV2:Win32_Account
--------------=----=-----=--------------
|     |       |          |       |- WMI中类名称(区分大小写)
|     |       |          |
|     |       |          |- 命名空间和WMI类名称的分隔符
|     |       |
|     |       |- 命名空间分隔符(主机名称也看作是命名空间理解跟方便)
|     |
|     |- 主机名称,远程的填写名称,本地可以简单的以点(".")代替
|
|- 主机名称前导符,固定用双斜杠表示,如果是本地,可以省略前导符和主机名称

\\ComputerName\ 这个如果是本地可以省略哦...

看明白了吧,\\.\root\CIMV2:Win32_Account这个路径代表的就是Win32_Account类的路径,当然,本地也可以直接root\CIMV2:Win32_Account这样了。

WMI中WQL就说的差不多了,毕竟是简明的基础教程嘛~~ 剩下的要靠自己参悟了哦,欢迎前来交流学习心得。Enjoy it.

WMI中的SQL,WQL简明教程系列4:语法

MitchellChu 2013-06-16 .NET技术 其他技术 编程语言

MitchellChu:WMI WQL教程  的WQL简明教程系列的前三篇文章[1,2,3]分别介绍WQL中的关键字,运算符和WMI中的类,由这三个东西,理论上已经能够完成WQL语句的编写了,不过也仅是理论上。就好比盖房子,理论上有水泥,钢筋和砖头是可以盖的,但实际上,并不是一定能盖出好房子的,甚至房子盖不成的也有,要盖好房子,还需要一个设计图纸,相对应的,咱们的WQL也同样,只有了一些基础的配件,有的时候并不一定能够装配出能正常运行的WQL语句。为了能够让我们能够组装出能够运行的WQL语句,就需要WQL的设计图纸——语法。

  从关键字篇我们能够看到,WQL并没有UPDATE,INSERT这类SQL中的语句,因此我们能够想象的到,WMI的WQL最主要的功能就是为了查询系统数据,因此我们学习WQL语法的时候,首先只要能够了解到查询数据的语法,基本上就能够应付大部分情况了,怎么样,还是相当的简单吧?那让我们开始吧,先看看下面的WQL:

SELECT * FROM Device
WHERE __CLASS = "Modem" OR __CLASS = "Keyboard"

  从上面的语句中我们能够看到WQL的,其和SQL语法类似,但WQL中多处了ASSOCIATORS OF和 REFERENCES OF两个查询结构,具体的WQL查询分为Schema,Data和Event查询,他们的区别:

  1. 数据查询:用于获取类实例,它返回特定类的所有实例,包括各自的请求属性集
  2. Schema查询:获取类定义,使用的基本语法的形式与其他类型的查询一样
  3. 事件查询:用于过滤出一个特定事件通知的属性。事件表征被管理环境的变更。
    每个查询允许添加一些附加的操作符,如:
    WITHIN:指定轮询
    GROUP:分组相同的事件
    HAVING:过滤WITHIN和GROUP子句收集事件的通知。一般与NumberofEvents属性(收集事件数量)一起。这样可以侦测何时特定事件的数量超过了时间间隔中设置的极限。

下面是Schema和Data查询的语法结构:

; -----------------------------------
; http://blog.useasp.net/
; MitchellChu's Blog
; WQL tutorial
; WQL schema and data 查询的语法结构
; -----------------------------------

DATA-WQL = 
 ("SELECT" <PROPERTY-LIST> "FROM" <CLASS-NAME> 
   <OPTIONAL-SEL-WHERE>)/ 
 ("SELECT" ASTERISK "FROM" <CLASS-NAME> <OPTIONAL-SEL-WHERE>)/ 
 ("SELECT" ASTERISK "FROM META_CLASS" <OPTIONAL-META-WHERE>)/
 ("ASSOCIATORS OF {" <OBJECT-REL-PATH> "}" 
   <OPTIONAL-ASSOC-WHERE>)/
 ("REFERENCES OF {" <OBJECT-REL-PATH> "}" <OPTIONAL-REF-WHERE>)

;========================================
; PROPERTY-LIST:属性列表
; 属性列表有属性名组成,多个属性名使用逗号分隔
; 如果奥全部选择,可以直接使用*(星号)代替
;========================================
PROPERTY-LIST = <PROPERTY-NAME> <PROPERTY-LIST2>
PROPERTY-LIST2 = [COMMA <PROPERTY-LIST>]

;========================================
; OPTIONAL-*-WHERE是WHERE子句
; 这个子句非必须,是用来缩小查询范围
;========================================
OPTIONAL-SEL-WHERE = ["WHERE" <EXPR>]
OPTIONAL-META-WHERE = ["WHERE __THIS ISA" <CLASS-NAME>]
OPTIONAL-ASSOC-WHERE = 
 ["WHERE" [ "AssocClass=" <CLASS-NAME> BLANK ] 
 [ "RequiredAssocQualifier=" <QUALIFIER-NAME> BLANK ]
 [ "RequiredQualifier=" <QUALIFIER-NAME> BLANK ]
 [ "ResultClass=" <CLASS-NAME> BLANK ]
 [ "ResultRole=" <PROPERTY-NAME> BLANK ] 
 [ "Role=" <PROPERTY-NAME> BLANK ]
 [ "KeysOnly" BLANK ] 
 [ "ClassDefsOnly" BLANK ]
                       ]
OPTIONAL-REF-WHERE = 
 ["WHERE" [ "RequiredQualifier=" <QUALIFIER-NAME> BLANK ]
 [ "ResultClass=" <CLASS-NAME> BLANK ]
 [ "Role=" <PROPERTY-NAME> BLANK ]
 [ "KeysOnly" BLANK ] 
 [ "ClassDefsOnly" BLANK ]
                     ] 

;========================================
; 
;========================================
OBJECT-REL-PATH = 
 <CLASS-NAME> "=" <TYPED-CONSTANT> <OBJECT-REL-PATH2>
OBJECT-REL-PATH2 = 
 [COMMA <OBJECT-REL-PATH>]

; -----------------------------------
; Expression 表达式
; -----------------------------------

EXPR =  
 ( [OPEN-PARENTHESIS] <PROPERTY-EVALUATION> 
    <EXPR2> [CLOSE-PARENTHESIS] ) / 
     ( [OPEN-PARENTHESIS] "__CLASS" <EQUIVALENT-OPERATOR> 
       <CLASS-NAME> <EXPR2> [CLOSE-PARENTHESIS] )

EXPR2 = ( ["OR"  [OPEN-PARENTHESIS] <EXPR> [CLOSE-PARENTHESIS] ])/
        ( ["AND" [OPEN-PARENTHESIS] <EXPR> [CLOSE-PARENTHESIS] ])

PROPERTY-EVALUATION = 
   ( <PROPERTY-NAME> <OPERATOR> <TYPED-CONSTANT> ) / 
    ( <PROPERTY-NAME> <IS-OPERATOR> "NULL" )

OPERATOR = <EQUIVALENT-OPERATOR> /
           <COMPARE-OPERATOR>

EQUIVALENT-OPERATOR = "=" / "!=" / "<>" 

COMPARE-OPERATOR = "<=" / ">=" / "<" / ">" / "LIKE"
IS-OPERATOR = "IS" / "IS NOT"

; -----------------------------------
; Characters 字符集
; -----------------------------------

ALPHA = %x41-5A
DIGIT = %x30-39
COMMA = ","
ASTERISK = "*"
OPEN-PARENTHESIS = "("
CLOSE-PARENTHESIS = ")"
BLANK = " " / "\x09"
DOUBLEUNDERSCORE = %x5f %x5f


STRING-IDENTIFIER = ALPHA *(ALPHA / DIGIT / (*("_") ALPHA / DIGIT)) 

CLASS-NAME = [DOUBLEUNDERSCORE]<STRING-IDENTIFIER>
PROPERTY-NAME = [DOUBLEUNDERSCORE]<STRING-IDENTIFIER>
QUALIFIER-NAME = <STRING-IDENTIFIER>


TYPED-CONSTANT = INT /
                 REAL /
                 UNICODE-STRING / 
                 DATETIME / 
                 BOOL


INT = "[-+]?\d+"
REAL = "[-+]?(\d*\.\d+)|(\d+)"
STRING = ["]([a-z][A-Z]\d)*["]
DATETIME is specified in section 2.2.1 of [DMTF-DSP0004]

BOOL = "TRUE" / "FALSE"
关于语法中的一些说明如下:
Schema 对象和关键字 描述
UNICODE-STRING 包含Unicode字符的字串。字串必须使用双引号("")或单引号('')括住。
CLASS-NAME 标记要查询的CIM类名。
PROPERTY-NAME 标记CIM类中的属性名称。
QUALIFIER-NAME 在WQL查询的上下文中,QUALIFIER-NAME是PROPERTY-NAME定义对另外一个CIM类关联类型的一个属性。所有的限定符,包含任何自定义的限定符,必须要在WQL查询的上下文中被支持。 RequiredAssocQualifier关键字指示:返回的端点必须与源对象通过一个包含指定限定符的关联类有关联。这个过滤的类型被用于缩小端点(endpoint)的范围,除非端点与目标通过一组特定的标记了的关联类进行关联。举例来说:下面的查询返回的是关联类包含了叫Association限定符的端点实例。
;==============================================
; http://blog.useasp.net/
; Mitchell Chu's Blog
; 关于RequiredAssocQualifier的示例
;==============================================
ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
WHERE RequiredAssocQualifier = Association
DATA-WQL 用来表示WQL查询的字符串。WQL字符串使用不同的WQL保留关键字来选择需要的信息类型。
SELECT 用来表示要选择的信息的要求的关键字(类似SQL中的SELECT)。SELECT表达要查询的CIM类或者CIM实例 。在ASSOCIATORS OF或 REFERENCES OF关键字在查询语句中没有使用的情况下,就必须使用SELECT. 但不能在使用了ASSOCIATORS OF或REFERENCES OF关键字的情况下使用。
PROPERTY-LIST PROPERTY-NAME值列表。 在列表中PROPERTY-NAME 各个值之间必须使用逗号分隔(",")。
ASTERISK 使用星号("*")表示需要CIM类或CIM实例中所有的属性值。
FROM 在SELECT语句中必须指定的一个关键字,用来表示CIM类或者CIM实例必须在查询之前执行。
OPTIONAL-SEL-WHERE WHERE语句用来缩小SELECT的范围。
OPTIONAL-META-WHERE WHERE语句用来缩小SELECT的范围。在WHERE后面跟__THIS ISA语句来缩小WQL查询的范围,用来根据下面的规则返回CIM实例:仅返回CLASS-NAME的实例和所有是继承自CLASS-NAME的CIM实例
__CLASS 这个关键字用来表示当前CIM对象引用的CIM对象类,关键字在WHERE子句中出现时,仅会选择派生于CLASS-NAME的CIM实例。
ASSOCIATORS OF 是WQL语句中用来查找相关CIM类或CIM实例的关键字。此关键字不能和SELECT和REFERENCES OF关键字一起使用。
OPTIONAL-ASSOC-WHERE 如果是在ASSOCIATORS OF的WQL查询中使用WHERE语句,将缩小范围至关联或关联的CIM类的一个或几个特征。这个过滤表达式可以用几个特殊的关键字和表达式组成来验证这些特征。 每个表达式像在前前面ABNF符号指定的那样,必须使用BLANK(空白符)分隔,每个表达式不能在单一的WQL查询中多次使用。用来缩小ASSOCIATORS OF查询范围的关键字有:AssocClass, RequiredAssocQualifier, RequiredQualifier, ResultClass, ResultRole, Role, KeysOnly, 和ClassDefsOnly。
REFERENCES OF 是WQL语句中查找CIM类或CIM实例关联的CIM类或CIM实例的关键字。该关键字不能与SELECT和ASSOCIATORS OF关键字一起合用。
OPTIONAL-REF-WHERE 如果在REFERENCES OF查询中指定WHERE语句, 将缩小关联的一个或多个特征和关联的类。这个过滤表达式可由几个特定的关键字和表达式组成来表示这些特征。表达式之间必须使用空白符(BLANK)来分隔,每个表达式不能在单挑个WQL查询中重复使用。支持用来缩小REFERENCES OF查询范围的关键字有:RequiredQualifier, ResultClass, Role, KeysOnly, 和ClassDefsOnly。
OBJECT-REL-PATH 被查询的CIM类或者CIM实例的CIM相对路径。在ASSOCIATORS OF和REFERENCES OF查询中必须指定。
KeysOnly 如果在ASSOCIATORS OF和REFERENCES OF的查询中使用了KeysOnly关键字,那么查询结果中的CIM实例仅要求关键属性必须被填充。
ClassDefsOnly 如果在ASSOCIATORS OF和REFERENCES OF查询中使用ClassDefsOnly关键字,仅要求结果中的CIM实例的CIM类定义必须返回。
AssocClass 如果在ASSOCIATORS OF查询中使用AssocClass关键字,返回的CIM实例结果必须与关联类或者由指定的CLASS-NAME组成CIM实例相关联。
RequiredAssocQualifier 如果在ASSOCIATORS OF查询中使用RequiredAssocQualifier关键字,返回的CIM实例必须通过包含了指定限定符的关联类与源对象相关联。如下示例:
;============================================
; http://blog.useasp.net/
; MitchellChu's Blog
; WQL tutorial
;============================================
ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
WHERE RequiredAssocQualifier = Association
返回的CIM实例必须通过包含限定符"association"的关联类与源对象{Win32_LogicalDisk.DeviceID="C:"}相关联
RequiredQualifier 在ASSOCIATORS OF和REFERENCES OF查询中如果使用了RequiredQualifier关键字,返回的CIM实例中必须要有在给定的名称集的CIM限定符。
ResultClass 在ASSOCIATORS OF和REFERENCES OF查询中如果使用了ResultClass关键字,返回的CIM实例必须是属于或者继承与CLASS-NAME指定的类。
Role 在ASSOCIATORS OF和REFERENCES OF查询中如果使用了Role关键字,返回的结果仅是那些角色与关联类的引用CIM属性名称相匹配的CIM实例。
ResultRole 在ASSOCIATORS OF查询中如果使用了ResultRole关键字,返回的结果仅是那些角色与CIM实例的引用CIM属性名称相匹配的CIM实例。可使用的值有:GroupComponent,PartComponent,Antecedent,Dependent

Event查询语法结构如下:

; -----------------------------------
; http://blog.useasp.net/
; MitchellChu's Blog
; WQL tutorial
; WQL event queries,Event查询
; -----------------------------------

EVENT-WQL = "SELECT" <PROPERTY-LIST> "FROM" / 
              <EVENT-CLASS-NAME> <OPTIONAL-WITHIN> <EVENT-WHERE>

OPTIONAL-WITHIN = ["WITHIN" <INTERVAL>]
INTERVAL = 1*MODULOREAL
EVENT-WHERE = ["WHERE" <EVENT-EXPR>]

EVENT-EXPR = ( (<INSTANCE-STATE> "ISA" <CLASS-NAME> <EXPR2>) /
              <EXPR> )
              ["GROUP WITHIN" <INTERVAL> 
                    ( ["BY" [<INSTANCE-STATE> DOT] <PROPERTY-NAME>] 
                      ["HAVING" <EXPR>] )]
INSTANCE-STATE = "TARGETINSTANCE" / "PREVIOUSINSTANCE"

; -----------------------------------
; Expression 表达式
; -----------------------------------

EXPR =
 [OPEN-PARENTHESIS] <PROPERTY-EVALUATION> /
  <EXPR2> [CLOSE-PARENTHESIS] 
EXPR2 = ( ["OR"  [OPEN-PARENTHESIS] <EXPR> / 
   [CLOSE-PARENTHESIS] ] ) /
        ( ["AND" [OPEN-PARENTHESIS] <EXPR> / 
   [CLOSE-PARENTHESIS] ] )

PROPERTY-EVALUATION = 
 ( <PROPERTY-NAME> <OPERATOR> <TYPED-CONSTANT> ) / 
  ( <PROPERTY-NAME> <IS-OPERATOR> "NULL" )

OPERATOR = <EQUIVALENT-OPERATOR> /
           <COMPARE-OPERATOR>

EQUIVALENT-OPERATOR = "=" / "!=" / "<>"
COMPARE-OPERATOR = "<=" / ">=" / "<" / ">" / "LIKE"
IS-OPERATOR = "IS" / "IS NOT"

; -----------------------------------
; Characters
; -----------------------------------

ALPHA = %x41-5A
DIGIT = %x30-39
DOT = ","
COMMA = "."
ASTERISK = "*"
OPEN-PARENTHESIS = "("
CLOSE-PARENTHESIS = ")"
STRING-IDENTIFIER = ALPHA *(ALPHA / DIGIT / (*("_") ALPHA / DIGIT)) 
DOUBLEUNDERSCORE = "__"

CLASS-NAME = [DOUBLEUNDERSCORE]<STRING-IDENTIFIER>
EVENT-CLASS-NAME = [DOUBLEUNDERSCORE]<STRING-IDENTIFIER>
PROPERTY-NAME = [DOUBLEUNDERSCORE]<STRING-IDENTIFIER>

TYPED-CONSTANT = INT /
                 REAL /
                 STRING / 
                 DATETIME / 
                 BOOL

INT = "[-+]?\d*"
REAL = "[-+]?\d*(\.\d+)?"
MODULOREAL = “[+]?\d*(\.\d+)?”
STRING = ["]([a-z][A-Z]\d)*["]
DATETIME is specified in section 2.2.1 of [DMTF-DSP0004]

BOOL = "TRUE" / "FALSE"

EVENT-WQL语法中的说明:

对象和关键字 描述
CLASS-NAME 标记要查询事件中的CIM类名称。
PROPERTY-NAME 标记CIM类中CIM属性的名称。
EVENT-WQL 用来表示WQL事件查询的字符串。WQL字符串使用不同的WQL保留关键字来选择需要的信息类型。
SELECT 用来表示要选择的信息的要求的关键字(类似SQL中的SELECT)。SELECT表达要查询的CIM类或者CIM实例 。在WQL事件查询中必须使用此关键字。
PROPERTY-LIST PROPERTY-NAME值列表。 在列表中PROPERTY-NAME 各个值之间必须使用逗号分隔(",")。
ASTERISK 使用星号("*")表示需要CIM类或CIM实例中所有的属性值。
FROM 在SELECT语句中必须指定的一个关键字,用来表示CIM类或者CIM实例必须在查询之前执行。
EVENT-CLASS-NAME 必须指定,必须为一个内在的,外在的或是一个定时器事件类。内在的事件类是指类继承于__InstanceOperationEvent, __ClassOperationEvent, 或__NamespaceOperationEvent,代表可能的内部事件。外在的时间类是指该类继承于__ExtrinsicEvent,代表可能的外部事件。 定时器事件类是指该类继承于__TimerEvent事件类,代表可能的定时器事件。
WITHIN 指示服务器轮询事件系统的关键字。在使用内部EVENT-CLASS-NAME时,必须指定WITHIN。对于外部EVENT-CLASS-NAME来说,WITHIN关键字是可选的。如果指定了WITHIN关键字,就必须指定INTERVAL。
INTERVAL INTERVAL指定轮询间隔,它必须以秒来表示,当使用了WITHIN时,必须使用INTERVAL。
EVENT-WHERE 在EVENT-CLASS-NAME是一个外部或定时器事件的CIM类时,WHERE语句缩小SELECT事件查询的范围。如果EVENT-CLASS-NAME是内部CIM类(intrinsic CIM class),WHERE语句必须使用在SELECT事件查询中缩小范围。
INSTANCE-STATE 表示被计算的实例的类型。INSTANCE-STATE在CLASS-NAME为内部CIM类时必须指定。INSTANCE-STATE在CLASS-NAME是外部CIM类时为可选。如果被使用,INSTANCE-STATE必须是PREVIOUSINSTANCE(用来指明在事件之前的CIM类或者CIM实例的状态必须被计算)或TARGETINSTANCE(用来指明在事件之后的CIM类或者CIM实例的状态必须被计算)
ISA 必须和INSTANCE-STATE关键字组合使用的关键字。它在INSTANCE-STATE和CLASS-NAME之间被用作比较运算符,用来减少CLASS-NAME查询返回到CIM实例的事件范围
GROUP WITHIN 如果使用了GROUP WITHIN,就必须使用INTERVAL。该关键字指明,所有在WITHIN INTERVAL期间发生的事件均作为一个事件来分组。
HAVING 如果指定了HAVING关键字,后面必须跟EXPR来过滤事件的选择。该关键字指明所有在GROUP WITHIN期间分组的事件必须在作为一个事件返回之前还要满足EXPR中指定的表达式要求。
BY 关键字在事件实例组中在指定的PROPERTY-NAME中共享同一个值。这种情况下,返回的时间表示该组事件共享同样的PROPERTY-NAME值。系统在事件组中必须返回与PROPERTY-NAME值中一样多的事件。
EVENT-EXPR 过滤WMI事件的表达式。

 有了这些语法,在应对WQL的操作时,就不再那么不知所措了,根据本文的语法,按照要求选取需要的关键字,找到关键的类,在WHERE子句用上操作符缩小下范围,就能找到自己想要的CIM类或者CIM实例了。enjoy it.

 

附注:

本文的文章大部分翻译自微软官方网站(才能有限,错愕之处还请指正):WQL Query

WMI中的SQL,WQL简明教程系列3:类

MitchellChu 2013-06-15 .NET技术 其他技术 编程语言

MitchellChu:WMI WQL教程  系列1系列2两篇文章比较简单的介绍了下WMI中WQL的关键字和运算符,有这两样东西我们就能够按照WQL的语法规则来写WQL语句了,等等,我们的WQL要操作的是什么?没错,我们会发现,在WQL语句中还缺少一个要操作的对象,这就是本文要说的,WMI中最重要的一个组成部分——。用过SQL语句的都应该清楚,无论是在MS SQL 还是MySQL中,我们如果要从数据库中查询数据,必须需要在SQL语句中指定查询的对象——表。在WQL中类的作用就相当于表,我们需要的数据会在不同的类中,而要将数据取出来,就要去找到各种对应的类。

  如果我们把WQL比作SQL的话,你就可以粗略的看作是数据库了,而WMI中的类,就是数据库中的表了,而类中返回的各种实例对象,可看作是表中的数据了。这个类比不完全正确,当深入会发现,每当要查询数据的时候,我们需要连接到指定的命名空间下,连接成功后,才能进行类的操作。现在暂时不去细究,初步有个概念就好,等具体操作的时候我们就能够明白了。

  那么,在WMI中,我们有多少类可以供查询呢?这个Mitchell倒是没有具体去统计数字,但在普通的操作中,能够涉及到的却并不是十分的多,我们可以用表格的形式列出在Win32下面比较常用的一些类。表格如下:

类名 描述
Win32_Fan 系统风扇
Win32_Keyboard 键盘
Win32_PointingDevice 指示设备,如鼠标
Win32_CDROMDrive CD-ROM
Win32_DiskDrive 系统的硬盘
Win32_PhysicalMedia 任何存储设备,在一般的机器上,包含CD-ROM,物理硬盘,软驱,磁带机等
Win32_BIOS 系统BIOS
Win32_CacheMemory 系统的Cache内存
Win32_MemoryDevice 内存,含相关联的映射地址
Win32_PhysicalMemory 物理内存
Win32_Processor CPU
Win32_NetworkAdapter 网络适配器,含物理网卡
Win32_NetworkAdapterConfiguration 网络适配器配置
Win32_NetworkAdapterSetting 网络适配器以及其相关设定
Win32_Printer 打印/传真设备
Win32_DesktopMonitor 显示设备
Win32_DisplayConfiguration 显示设备配置
Win32_Desktop 桌面
Win32_Environment 系统环境
Win32_Directory 文件目录,所有的目录
Win32_DiskPartition 磁盘分区
Win32_LogicalDisk 逻辑磁盘
Win32_Process 进程信息
Win32_Account 账户信息
Win32_PerfFormattedData 格式化后的性能数据
Win32_Service 系统服务

   有了WMI类之后,我们就可以根据自己的需要来写WQL来查询系统中的各个数据了,比如我们想知道当前系统中有多少物理磁盘的存在,只需要下面这样就能返回系统的磁盘实例:

SELECT * FROM Win32_DiskDrive

  如果需要进一步了解这些物理磁盘的信息,可以从获取的参数中去查找,这些参数,你可以查找MSDN上的帮助文档即可,是不是非常的方便?

 

附注:

更多关于WMI类的帮助可以参见官方文档:Management Infrastructure Classes

WMI中的SQL,WQL简明教程系列2:运算符

MitchellChu 2013-06-15 .NET技术 其他技术 编程语言

MitchellChu:WMI WQL教程  系列1中我们已经介绍了的查询语言WQL中的关键字,相信在看完关键字之后,对于WQL的语句肯定不会那么陌生了,然而,有了关键字,自然还是不够的,至少在使用WHEE子句的时候,我们需要用到一些条件不是,而这些条件自然而然的就需要使用到本文说到的东西——运算符。虽然可以看作是SQL的一个子集,但是关键字会有些不同(前面已经有说过),运算符也会有些诧异。那么让我们看看在WQL中有哪些运算符。

  既然是SQL的一个自己,可以预见的是WQL中的运算符和SQL中的运算符应该差别也不是很大,在前面将关键字的时候,我们给出的WQL语句中就有部分运算符在使用了,而在关键字列表中,我们也给出了部分的。先给个例子:

SELECT * FROM Win32_NetworkAdapterConfiguration
WHERE IPEnabled=TRUE

  在上面例子中我们在WHERE子句中就使用了=运算符,TRUE运算符。进入主题,WQL的基本运算符有以下这些:

WQL运算符 WQL运算符描述 使用类型
= 等于 string, numeric, reference, datetime
< 小于 string, numeric, datetime
> 大于 string, numeric, datetime
<= 小于或等于 string, numeric, datetime
>= 大于或等于 string, numeric, datetime
!= 或者 <> 不等于 string, numeric, reference, datetime

基本运算符,这类运算符和SQL中的运算符一样,为二元比较运算符,但只是SQL中的一个子集,因为没有!<, !>这些。除了这些基本的运算符之外,WQL还支持下面这些特殊点的运算符

WQL运算符 WQL运算符描述 适用类型
IS 后面仅能跟NULL string, numeric, reference, datetime, object
IS NOT 后面仅能跟NULL string, numeric, reference, datetime, object
ISA is a关系,具体可以参见关键字中的ISA说明 UNKOWN
LIKE 类似于 string

 

/*正确的WQL IS NULL和IS NOT NULL的用法*/
SELECT * FROM Win32_LogicalDisk
WHERE FileSystem IS NULL

SELECT * FROM Win32_LogicalDisk
WHERE FileSystem IS NOT NULL

/*WQL中IS 和 IS NOT的错误用法*/
SELECT * FROM Win32_LogicalDisk
WHERE DriveType IS 5

SELECT * FROM Win32_LogicalDisk
WHERE FileSystem IS NOT "NTFS"

在SQL中,IS [NOT] NULL被作为谓词单独列出讨论,而在WQL中,IS [NOT] NULL被当作运算符来讨论,这点MitchellChu不太能够理解其中奥秘,只能按照官方说法,将其归类为运算符一类,可能是WQL确实比较简单,无需进行复杂分类吧。而上面表中的LIKE运算符比较特殊,因为在LIKE中,我们会使用通配符,因此LIKE对通配符也有一个对照表:

Character 描述
[ ] 任何一个在指定范围内([a=f]) 或者集合([abcdef])的字符
^ 任何一个不在指定范围内 ([^a=f]) 或集合内([^abcdef])的字符
% 任何0(zero)个或多个字符的字符串 。
_ (underscore) 任何一个字符。任何在查询字符串中的下划线必须放到[](Asquare brackets)内进行转义。

LIKE示例:

/*在class名称中包含Win的所有实例*/
SELECT * FROM meta_class
WHERE __Class LIKE "%Win%"

/*转义_下划线*/
SELECT * FROM meta_class
WHERE __CLASS LIKE "%[_][_]%"

 此外,为了在WHERE子句能够进行多个条件表达式存在,WQL支持使用简单的AND和OR运算符来连接上面运算符的结果。在SQL中,这类运算符称作为:逻辑运算符。WQL中同样没有明确归类。

WQL运算符 WQL运算符描述
AND 连接两个布尔表达式,仅都为TRUE是返回TRUE
OR 连接两个布尔表达式,单有一个为TRUE是返回TRUE,当OR和AND同时存在,AND优先级高于OR
NOT 布尔表达式取反,TRUE时返回FALSE

 示例:

/*
派生于的类名需要是Win32开头的,并且不是Win32_Account或其子类
*/
SELECT * FROM meta_class
WHERE NOT __class < "Win32" AND NOT __this ISA "Win32_Account"

   至此,WQL的运算符涵盖的比较全面了,前面关键字和本文的运算符,再配合SQL中的基本语法,你应该可以初步的写些WQL语句了。

 

附注:

本文内容来源于微软MSDN:WQL OperatorsLIKE Operator

WMI中的SQL,WQL简明教程系列1:关键字

MitchellChu 2013-06-15 .NET技术 其他技术 编程语言

MitchellChu:WMI WQL教程  WMI(, Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。WMI 通过编程和脚本语言为日常管理提供了一条连续一致的途径。而要在编程或者脚本语言中使用WMI,那自然不可或缺的就是WMI的查询语言(WQL,WMI Query Language),WQL是在美国国家标准研究所结构查询语言(ANSI SQL)的一个子集,并在此基础上作出稍许语义变化。WQL非常类似与通常使用的SQL语句,却没有SQL语句那么的复杂多变,算起来也可以说只是SQL语句的一个小子集。

  要了解和使用,WQL中使用的关键字是不可或缺的一环,像下面这些语句,你了解多少呢?

SELECT * FROM Win32_NetworkAdapterConfiguration
WHERE IPEnabled = True

SELECT * FROM Meta_Class
WHERE __Class LIKE "%Win32%"

ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
WHERE RequiredQualifier = Locale

看不懂? 没关系,本文就是本着看懂WQL语句的目的而来的。下面这个表格就是WQL会用到的,而且后面还有对关键字的解释,相信你在看完MitchellChu整理翻译的这张表之后,上面这些语句应该不在话下了——至少知道他们大概是干什么的了。

WQL 关键字 关键字解释
AND

连接两个布尔表达式,当两个布尔表达式都为TRUE时返回TRUE,否则返回FALSE,这个和SQL语句中的WHERE子句中的AND类似。

示例:查询Index为1并且IPEnabled为TRUE的网卡

SELECT * FROM Win32_NetworkAdapterConfiguration
WHERE Index=1 AND IPEnabled=TRUE
      
ASSOCIATORS OF

获取所有与特定源实例关联的终结点实例集合。在架构查询和数据查询中使用此语句。

示例:查询所有和逻辑盘符为C:的,并且ResultRole为GroupComponent的实例

ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
WHERE ResultRole = GroupComponent
      
__CLASS

在查询结果集中对象继承的类对象引用。

示例:查询所有class派生于Win32_LogicalDisk的类实例,如果没有WHERE子句,则返回的是所有派生于Win32_LogicalDisk或者class直接为 Win32_LogicalDisk的对象集合

SELECT * FROM Win32_LogicalDisk
WHERE __CLASS="Win32_LogicalDisk"
        
Windows NT 4.0 and Windows Me/98/95:不可用
FROM 指定SELECT语句中所有结果集的来源类。Windows Management Instrumentation(WMI)一次仅支持从一个类中查询数据。
GROUP Clause

引起WMI产生一个通知来代表一组事件,

HAVING 过滤在指定WITHIN子句分组中接收到的事件。这个是配合GROUP子句使用的。
IS 和 NOT还有NULL配合使用的比较运算符,更多可以参加WQL 运算符。使用语法如下:

IS [NOT] NULL

( NOT为可选)

ISA

运算符指定查询中子类为某个特定的class,针对Event查询,Data查询,Schema 查询,可以参见(英文):ISA Operator for Event Queries,ISA Operator for Data Queries, ISA Operator for Schema Queries.

示例:

SELECT * FROM __InstanceModificationEvent WITHIN 600
WHERE TargetInstance ISA "Win32_LogicalDisk"
KEYSONLY

在REFERENCES OF和ASSOCIATORS OF 查询中用来确认返回的结果实例集中只有关键的实例/属性被填充。以此来降低查询的调用成本。

示例:

ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
WHERE KEYSONLY
Windows 2000, Windows NT 4.0, and Windows Me/98/95: 不可用.
LIKE

用来确定给定的字符串是否匹配指定模式的运算符。使用类似于SQL语句中的LIKE。

示例:

SELECT * FROM meta_class
WHERE __CLASS LIKE "%[_][_]%"
NOT

在WQL SELECT查询中使用的比较运算符:

示例:

SELECT * FROM meta_class
WHERE NOT __class < "Win32" AND NOT __this ISA "Win32_Account"
NULL 表明一个对象没有明确的指定值,NULL 不等于零(0) 或空
OR 合并两个条件结果的逻辑运算符。当在语句中使用了多个逻辑运算符是,OR运算符优先级在AND运算符之后。
REFERENCES OF 获取所有引用特定源实例的关联实例集,一般在schema和data查询中使用,REFERENCES OF语句与ASSOCIATORS OF 语句类似,。但需要注意的是REFERENCES OF并不会获取中介点的实例(endpoint instances),而仅是获取关联实例集。
SELECT 指定在查询中需要使用的属性集。更多信息可以参见data查询,Event 查询,Schema查询,具体连接为(英文):SELECT Statement for Data Queries, SELECT Statement for Event Queries, SELECT Statement for Schema Queries.
TRUE 布尔运算符,其结果为:-1 (minus one).
WHERE 缩小data,event,schama查询的范围
WITHIN 指定轮询的间隔或者分组区间,一般在event查询中使用此子句。
FALSE 布尔运算符, 其值为:0 (zero).

  看完上面这个表之后,有没有发现WQL其实和SQL非常的相像?除了一些像REFERENCES OF这样特别些的语法,其他和SQL真的差不多,难怪乎会说WQL是SQL的一个子集。接下来,我们可以在看看WQL的运算符,因为要组成一个完整的WQL语句,与关键字还不行,还得有运算符。

  准备好了么?让我们去看看WQL的运算符了——WMI中的SQL,WQL简明教程系列2:运算符

 

附注:

本文的关键字列表翻译自微软官网:WQL (SQL for WMI)

程序侦测当前网络连通性的各种实现

MitchellChu 2013-06-14 .NET技术

用程序进行网络状态检查  在实际的应用开发中,我们的应用程序经常需要在运行时侦测当前系统的,特别是在应用程序需要访问网络的时候,可以通过运行时的侦测网络连通性,及时反馈给用户,以便用户做出正确的选择;也可以在得到侦测结果后,系统根据网络的连通性状态做出相应的处理,比如在需要网络访问才能正常使用的应用程序中,一旦检测到网络不能正常使用之后,做出相应的处理,可以更好的防止不必要错误异常发生。当前系统.NET进行网络的连通性侦测有很多种方法,本文将使用.NET(C#/VB)代码展示多种具有代表性且比较简易的方法来的连通性。

第一种方法:使用WebRequest/HttpWebRequest对象来访问指定的主机名。代码如下:

//通过访问网页的方式确定当前系统的连通性
//需要注意,选择的主机名/域名必须确保异常的可能性尽可能小
public bool HttpRequestMonitor(string host)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36";
    request.Method = "GET";
    try
    {
        using (HttpWebResponse response = ((HttpWebResponse)request.GetResponse()))
        {
            return true;
        }
    }
    catch (Exception ex)
    {
        return false;
    }
    return true;
}

上面使用的是HttpWebRequest的方式来检测,你也可以直接使用WebRequest,代码如下:

//需要确保主机名/域名的连通性高
public static bool WebRequestMonitor(string host)
{
    try
    {
        WebRequest myRequest = WebRequest.Create(host);
        WebResponse myResponse = myRequest.GetResponse();
    }
    catch (WebException)
    {
        return false;
    }
    return true;
}

这两种方法都可以达到检测的目的,优势是方便理解,也能快速上手,但有一个劣势,就是用来检测的网站域名必须要能够确保长时间正常在线,如果要访问的域名出现故障,那么检测将不准确。

第二种方法:TCP Socket检测,这里可以使用主机名,也可以使用IP地址。使用主机名/域名的方式如下:

//使用主机名方式来检测连通性
// 如果是域名,后面的port一般为80
public static bool TcpSocketMonitor(string host, int port)
{
    try
    {
        using(TcpClient client = new TcpClient(host, port))
        {
        	client.Close();
        }
    }
    catch (Exception ex)
    {
        return false;
    }
    return true;
}

使用IP地址来访问:

//基本和使用主机名检测的方法类似.
public static bool TcpSocketMonitorByIp(string ip, int port)
{
    try
    {
        using (TcpClient client = new TcpClient(new IPEndPoint(IPAddress.Parse(ip), port)))
        {
            client.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
    return true;
}

这种方法的优势也是使用难度不高,劣势同样是选择的目标必须在线率高,不然会存在不稳定的现象。如果使用IP的方式,可以使用两台机器进行互相检测,这样可以比较好的规避在线率的问题。

第三种方法:也就是我们常用的Ping了,Ping同样可以使用主机名/域名或者IP,代码如下:

//使用主机名/域名的方式来检测网络的连通性
public bool PingServer(string host)
{
    try
    {
        Ping ping = new Ping();
        PingReply replye = ping.Send(host, 1000);
        //如果使用IP,那么只需ping.Send(IPAddress.Parse(host), 1000)这种方式即可
        return replye.Status == IPStatus.Success;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}

 这种方式比前面的方法有一定的优势,即无需对指定端口的访问,但劣势同样和前面的一样,依赖目标服务器,并且很有可能会出现禁Ping的情况。如果是内部的服务器相互Ping,效果会好些。

第四种方法:使用DNS来检测网络的连通性,这种方法是通过DNS来获取域名的IP,代码如下:

//请求DNS返回域名的IP,如果没有错误,说明网络连通
public bool DnsLookup(string host)
{
    try
    {
        IPHostEntry ipHE = Dns.GetHostEntry(host);
        return true;
    }
    catch (Exception ex)
    {
        //Console.WriteLine(ex.Message);
        return false;
    }
}

这个方法优于前面三种方法,而且前面三种方法的基础也是DNS,因此用这种方法应该是当前最佳的。优势是简单,并且一般不太可能出现DNS异常的情况。

第五种方法:使用Windows Internet API (WinINet)来操作,这个方法来源于网络[1],一般比较少使用这种方式,代码如下:

[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int connDescription, int ReservedValue);
//尝试建立到互联网的连接来检测连通性
public static bool IsConnectionAvailable()
{
    int Desc;
    return InternetGetConnectedState(out connDesc, 0);
}

 

第六种方法:使用WMI的方式确定当前网络的连通性[2]。该方法是使用WMI来PING,方法比较复杂,需要了解WMI的方法,具体方法如下:

strComputer = "."
Set objWMIService = GetObject(_ 
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colPings = objWMIService.ExecQuery _
    ("Select * From Win32_PingStatus where Address = '192.168.1.1'")

For Each objStatus in colPings
    If IsNull(objStatus.StatusCode) _
        or objStatus.StatusCode<>0 Then 
        WScript.Echo "Computer did not respond." 
    Else
        Wscript.Echo "Computer responded."
    End If
Next

   在实际使用中,个人比较喜欢选用DNS的方式来确定网络连通性,当然也不一定,在实际情况中,根据自己的需求选择适当的方式即可。

 

附注:

1. 本文的大部分方法都可以在这里找到:http://www.codeproject.com/Tips/147662/Testing-Internet-Connectivity

非常感谢作者的耐心和细心分类,由于全部是英文,我权当翻译了一下好了,很多没有实际中使用的方法,本文直接引用了原文的例子,有的稍作修改。

2. WMI的方式是在微软官方网站中的例子,你可以在这里找到:http://msdn.microsoft.com/en-us/library/windows/desktop/aa394595(v=vs.85).aspx

.NET正则表达式提取HTML元素所有属性的方法

MitchellChu 2013-06-14 .NET技术 HTML&HTML5

.NET教程:正则表达式提取HTML标签属性的方法  在各类文本处理中,往往要涉及到在文本中提取数据、替换数据的操作,这种情况下,我们一般使用来简化我们的处理(一般没谁会自己写吧?写了效率也不一定高啊)。同样,在涉及到HTML的一些处理中,个人也非常喜欢使用正则表达式系统来进行HTML元素内容的替换、提取等操作,也是文本嘛。

  随着使用的频次增多,对正则表达式系统的了解自然也就不断深入,在后来的一次,突然发现,正则表达式原来可以提取HTML中的所有属性,甚至 可以直接将HTML解析成DOM树。面对突如其来的强大功能,一时间还真有些不知所措,要知道,在之前,解析HTML咱是靠第三方工具的。正则表达式最多也就是提取下特定的字串内容,替换下内容,像对于提取HTML元素中多个属性的方法想都没想能用正则表达式,而是毫不犹豫的将元素提取出来后老老实实的去做字串处理,要不就是使用第三方的插件来完成这无比艰巨的工作。现在发现正则表达式竟然可以如此简单的完成,太惊喜了!

  为了展现正则表达式的强大功能,让我们赶紧找个例子来试试吧——用正则表达式提取HTML标签(元素)中所有的

  输入内容:任意HTML源码

  要求:提取指定元素的所有属性

  输出内容:指定HTML元素的所有属性

  来看看正则表达式是怎么完成的,代码:

// 注意:本例仅为测试用,投入到生产环境中需要根据需求进行调整
// 测试结果相当的不理想:解析64KB数据,10个匹配项,耗时99s

        public static IList<IDictionary<string,string>> ParseHtml(string html)
        {
            IList<IDictionary<string, string>> tags = new List<IDictionary<string, string>>();
            //MitchellChu .NET Blog
            // 首先定义下正则表达式
            Regex regexParser = new Regex("<img(?:\\s*([\\w\\-]+)(?:\\s*=\\s*(?<qouta>['\"]?)([^'\"]*)\\k<qouta>)?\\s*)*>", RegexOptions.IgnoreCase);
            // 这里注意
            // 1. 使用qouta的原因是因为引号要配对
            // 2. 引号在实际中,也有可能不存在,要加上?
            // 3. 只要属性名和属性值,因此其他的我们都忽略

            MatchCollection tagsMatched = regexParser.Matches(html);
            // 遍历所有的匹配HTML元素
            foreach (Match m in tagsMatched)
            {
                Dictionary<string, string> attrs = new Dictionary<string, string>();
                //将匹配到的HTML元素内的属性键值对存入字典中
                for (int i = 0; i < m.Groups[1].Captures.Count; i++)
                {
                    attrs.Add(m.Groups[1].Captures[i].Value, m.Groups[2].Captures[i].Value);
                }
                tags.Add(attrs);
            }
            return tags;
        }

  从例子中我们可以看到,我们能够非常简单的将HTML元素中的所有属性都取到。虽然结果能够得到,但在实际使用中如果直接这么放上去那肯定要出问题的,Mitchell本地测试的结果是:64KB的数据,10个匹配项,耗时99s!CPU很弱?No!你没看错,99s的时间,差不多2分钟了。怎么会这样呢?原因在于正则表达式系统对于当前的正则表达式的解读太深入了。具体原因你可以思考下(Tips:正则表达式是个贪婪的家伙),下面放出稍微优化过的正则表达式吧:

//方法也稍微做了修改,将正则表达式作为参数传入方法内部
        public static IList<IDictionary<string,string>> ParseHtml(string html, string patern)
        {
            IList<IDictionary<string, string>> tags = new List<IDictionary<string, string>>();
            //MitchellChu .NET Blog
            // 首先定义下正则表达式
            Regex regexParser = new Regex(patern, RegexOptions.IgnoreCase);
            // 这里注意
            // 1. 使用qouta的原因是因为引号要配对
            // 2. 引号在实际中,也有可能不存在,要加上?
            // 3. 只要属性名和属性值,因此其他的我们都忽略

            MatchCollection tagsMatched = regexParser.Matches(html);
            // 遍历所有的匹配HTML元素
            foreach (Match m in tagsMatched)
            {
                Dictionary<string, string> attrs = new Dictionary<string, string>();
                //将匹配到的HTML元素内的属性键值对存入字典中
                for (int i = 0; i < m.Groups[1].Captures.Count; i++)
                {
                    attrs.Add(m.Groups[1].Captures[i].Value, m.Groups[2].Captures[i].Value);
                }
                tags.Add(attrs);
            }
            return tags;
        }

//这里调用方法
var result = ParseHtml(html, "<img(?:\\s+([\\w\\-]+)(?:\\s*=\\s*(?<qouta>['\"]?)([^'\">]*)\\k<qouta>)?)*\\s*>");

// 同样的方法,仅仅是正则表达式的改变
// 同样测试64KB数据,10个匹配项,耗时 11ms

  做同样的事情,但是经过稍微优化后的正则表达式在性能上远远超过没有经过优化的正则表达式。由此可见,正则还是把双刃剑,需要好好谨慎的使用,不然会让你的系统慢如蜗牛。

SublimeText2 快捷键一览表

MitchellChu 2013-06-14 其他技术

Sublime Text 2  比起Notepad++,UltraEdit之类Code编辑器来说,其功能有过之而无不及,配合着各种插件使用,Sublime Text在实际的使用中变得非常的顺手——当然,如果你还不顺手,那就请顺手写个插件吧。而在众多功能中,Sublime Text 还提供了无比强大的快捷键阵容,如果能够在Coding的时候灵活的使用快捷键,将能够使得你的效率倍增,相信在不久的将来,Sublime Text将是你跨平台使用的最佳Coding利器。

  然而,对于新入门的Sublime Text 的newbie来说,强大的阵容让人无所适从,或者连记住这些快捷键都将是一个困难重重的不可完成任务。使用Sublime Text需要的是时间和耐心,本着这个目的,Mitchell花了一些时间,将Sublime Text2中的快捷键整理了一份,同时对一些重要的快捷键进行了中文翻译,以方便和我一样的新手能够比较简单查找,然后在实践中不断的重复使用,以达到炉火纯青的地步(我是不指望这么高的追求的,但你可以有~~)。

  现在分享下在Sublime Text 2中的快捷键不完全翻译版本,用表格的形式放出,如果有错误之处,还请大家指正,如下:

 

快捷键 功能
ctrl+shift+n 打开新Sublime
ctrl+shift+w 关闭Sublime,关闭所有打开文件
ctrl+shift+t 重新打开最近关闭文件
ctrl+n 新建文件
ctrl+s 保存
ctrl+shift+s 另存为
ctrl+f4 关闭文件
ctrl+w 关闭
ctrl+k, ctrl+b 切换侧边栏显示状态
f11 切换全屏状态
shift+f11 免打扰模式状态切换
backspace 删除左侧
shift+backspace 左侧删除
ctrl+shift+backspace 左侧全部删除
delete 右侧删除
enter 插入
shift+enter 插入
ctrl+z 撤消
ctrl+shift+z 重做
ctrl+y 重做或重复
ctrl+u 软撤消
ctrl+shift+u 软重做
ctrl+shift+v 粘贴并格式化
shift+delete 剪切
ctrl+insert 拷贝
shift+insert 粘贴
ctrl+x 剪切
ctrl+c 拷贝
ctrl+v 粘贴
left 移动
right 移动
up 移动
down 移动
shift+left 移动并选择
shift+right 移动并选择
shift+up 移动并选择
shift+down 移动并选择
ctrl+left 按\w规则移动(跳跃)
ctrl+right 按\w规则移动(跳跃)
ctrl+shift+left 按\w规则移动并选择(跳跃)
ctrl+shift+right 按\w规则移动并选择(跳跃)
alt+left 按单词移动
alt+right 按单词移动
alt+shift+left 按单词移动并选择
alt+shift+right 按单词移动并选择
ctrl+alt+up 选择多行进行编辑
ctrl+alt+down 选择多行进行编辑
pageup 移动
pagedown 移动
shift+pageup 移动+选择
shift+pagedown 移动+选择
home 移动到行首
end 移动到行尾
shift+home 选择到行首
shift+end 选择到行尾
ctrl+home 移动到页首行头
ctrl+end 移动到页尾行尾
ctrl+shift+home 选择到页首行头
ctrl+shift+end 选择到页尾行尾
ctrl+up 滚动行
ctrl+down 滚动行
ctrl+pagedown 下一视图(视觉位置)
ctrl+pageup 前一视图
ctrl+tab 栈中下一视图(打开顺序)
ctrl+shift+tab 栈中前一视图
ctrl+a 全选
ctrl+shift+l 选择多行编辑
escape 单个选择
escape 清除字段
escape 清除字段
escape 隐藏面板
escape hide overlay
escape hide auto complete
tab insert best completion
tab insert best completion
tab replace completion with next completion
tab reindent
tab indent
tab next field
tab commit completion
shift+tab insert
shift+tab unindent
shift+tab unindent
shift+tab unindent
shift+tab prev field
ctrl+] 缩进
ctrl+[ 不缩进
insert toggle overwrite
ctrl+l 选择行,重复可依次增加选择下一行
ctrl+d 选择单词,重复可增加选择下一个相同的单词
ctrl+k, ctrl+d find under expand skip
ctrl+shift+space expand selection
ctrl+shift+m expand selection
ctrl+m 跳转到对应括号
ctrl+shift+j expand selection
ctrl+shift+a expand selection
alt+. close tag
ctrl+q toggle record macro
ctrl+shift+q run macro
ctrl+enter run macro file
ctrl+shift+enter 在当前行前插入新行
enter commit completion
ctrl+p 搜索项目中的文件
ctrl+shift+p 打开命令面板
ctrl+alt+p prompt select project
ctrl+r 前往Method
ctrl+g 跳转到第几行
ctrl+; show overlay
ctrl+i show panel
ctrl+shift+i show panel
ctrl+f 查找
ctrl+h 查找替换
ctrl+shift+h 查找替换下一个
f3 下一个匹配项
shift+f3 上一个匹配项
ctrl+f3 下一个匹配项
ctrl+shift+f3 find under prev
alt+f3 find all under
ctrl+e slurp find string
ctrl+shift+e slurp replace string
ctrl+shift+f show panel
f4 next result
shift+f4 prev result
f6 toggle setting
ctrl+f6 next misspelling
ctrl+shift+f6 prev misspelling
ctrl+shift+up swap line up
ctrl+shift+down swap line down
ctrl+backspace delete word
ctrl+shift+backspace run macro file
ctrl+delete delete word
ctrl+shift+delete run macro file
ctrl+/ 当前行注释状态切换
ctrl+shift+/ 当前位置注释状态切换
ctrl+j 选择标签内容,将后继行附加到行尾
ctrl+shift+d duplicate line
ctrl+` show panel
ctrl+space auto complete
ctrl+space replace completion with auto complete
ctrl+alt+shift+p show scope name
f7 build
ctrl+b build
ctrl+shift+b build
ctrl+break exec
ctrl+t transpose
f9 行排序
ctrl+f9 行排序
// Auto-pair quotes
\ insert snippet
\ insert snippet
\ move
backspace run macro file
// Auto-pair single quotes
' insert snippet
' insert snippet
' move
backspace run macro file
// Auto-pair brackets
( insert snippet
( insert snippet
) move
backspace run macro file
// Auto-pair square brackets
[ insert snippet
[ insert snippet
] move
backspace run macro file
// Auto-pair curly brackets
{ insert snippet
{ insert snippet
} move
backspace run macro file
enter run macro file
shift+enter run macro file
ctrl+1 focus group
ctrl+2 focus group
ctrl+3 focus group
ctrl+4 focus group
ctrl+shift+1 move to group
ctrl+shift+2 move to group
ctrl+shift+3 move to group
ctrl+shift+4 move to group
ctrl+0 focus side bar
alt+1 select by index
alt+2 select by index
alt+3 select by index
alt+4 select by index
alt+5 select by index
alt+6 select by index
alt+7 select by index
alt+8 select by index
alt+9 select by index
alt+0 select by index
f2 next bookmark
shift+f2 prev bookmark
ctrl+f2 标记状态切换
ctrl+shift+f2 clear bookmarks
alt+f2 select all bookmarks
ctrl+shift+k run macro file
alt+q wrap lines
ctrl+k, ctrl+u upper case
ctrl+k, ctrl+l lower case
ctrl+k, ctrl+space set mark
ctrl+k, ctrl+a select to mark
ctrl+k, ctrl+w delete to mark
ctrl+k, ctrl+x swap with mark
ctrl+k, ctrl+y yank
ctrl+k, ctrl+k run macro file
ctrl+k, ctrl+backspace run macro file
ctrl+k, ctrl+g clear bookmarks
ctrl+k, ctrl+c show at center
ctrl++ increase font size
ctrl+= increase font size
ctrl+keypad plus increase font size
ctrl+- decrease font size
ctrl+keypad minus decrease font size
alt+shift+w insert snippet
ctrl+shift+[ 折叠(代码)
ctrl+shift+] 不折叠
ctrl+k, ctrl+1 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+2 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+3 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+4 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+5 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+6 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+7 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+8 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+9 按层级折叠(代码),数字是层级数
ctrl+k, ctrl+0 unfold all
ctrl+k, ctrl+j unfold all
ctrl+k, ctrl+t fold tag attributes
context menu context menu
alt+c toggle case sensitive
alt+r toggle regex
alt+w toggle whole word
alt+a toggle preserve case
// 查找面板的按键绑定
enter 向后查找
shift+enter 向前查找
alt+enter 查找全部
// 替换面板的按键绑定
enter 查找下一个
shift+enter 查找前一个
alt+enter 查找全部
ctrl+alt+enter 替换全部
// Incremental find panel key bindings
enter hide panel
shift+enter find prev
alt+enter find all

VisualStudio使用IIS调试出错的处理方法

MitchellChu 2013-06-14 .NET技术 其他技术

Visual Studio 2010 .NET Debug教程  在中,当网站需要进行web调试的时候,我们一般都是直接使用VS自带的Server进行调试,也就是直接F5就解决了问题,但并不是所有的问题都能在这种问题下解决,因此我们有的时候需要使用IIS作为Web Server来进行调试。使用IIS作为宿主的时候,很有可能不会像使用VS自带的Web Server调试来的顺利,而我最近的一次调试中就出现下面这个报错:

英文报错:Unable to start debugging on the web server.An authentication error occured while communicating with the web server.

中文报错:无法在WEB服务器上启动调试。

  当然,也可能出现其他的错误,经过摸索,问题解决了,在网上也看到有很多人在使用IIS6/7进行调试的时候出现不能调试的情况,为了让有同样的问题朋友们能够有一个更简单的处理方式,我将可能出现问题的地方做了个初步汇编,如果出现不能使用IIS来时,可以按照这个步骤来检查下开发机器上的配置是否正确。

No1. IIS配置检查

  要使用来调试网站,自然要在IIS中配置好网站,具体的配置请参见IIS新建网站的配置说明,这里不赘述。为了保证网站能够正常运行,你可能需要关注网站的权限问题。在网站能够正常运行的情况下,却无法使用Visual Studio进行Web Debugging的时候,请检查下面配置:

  1. 网站配置项中,网站标签下的连接是否启用了保持HTTP连接项,IIS6的操作路径:
    IIS6管理器中右键当前调试网站--属性--网站--连接--保持HTTP连接
  2.  检查是否启用Windows身份验证。IIS6路径:
    IIS6管理器中右键当前调试网站--属性--目录安全--身份验证和访问控制--编辑--用户访问需经过身份验证--集成Windows身份验证
  3. 如果是ASP这样的网站也许你要启用在服务端进行ASP调试的选项,路径为: 
    IIS6管理器中右键当前调试网站--属性--主目录--应用程序设置--配置...--调试--调试标志--启用ASP服务器端脚本调试 && 启用ASP客户端脚本调试
  4. 启用IIS中ASP.NET的调试项,这项也可以从web.config中设置,路径为:
    IIS6管理器中右键当前调试网站--属性--ASP.NET--Edit Configuration(编辑配置)--应用程序--公共编译、页和运行时设置--勾选:启用调试--确定
  5. 如果你是IIS7,可以尝试启用IIS7中的Class .NET AppPool,经典的.NET应用程序池,路径:
    当前调试站点--高级设置--应用程序池--Class .NET AppPool(经典模式)

上述问题配置配置如果设置之后,还是无法正常使用IIS调试VS中的Web程序,那么你可能还需要检查。

No2. 注册表配置检查[1]

  1. 禁用环回检查,将DisableLoopbackCheck 注册表项值置为1,Mitchell自己在Windows2003的问题就是这个方法解决的,注册表路径:
    开始--运行--输入:regedit--确定--路由到下面路径:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
    --右键:Lsa--新建--DWORD值--键入:DisableLoopbackCheck--右键:DisableLoopbackCheck--修改--数值数据框输入:1--确定。
    
    ##注意:
    操作后如果无法直接生效,可能需要重启系统。
  2. 指定主机名,将DisableStrictNameChecking注册表项值置为1,具体操作方法:
    开始--运行--键入:regedit--确定--路由到下面注册表项:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
    --右键:MSV1_0--新建--多字符串值--输入:BackConnectionHostNames--确定--右键:BackConnectionHostNames--修改--数值数据--输入本地网站的主机名(可多个)--确定--重启IISAdmin服务

No3. Visual Studio配置检查,此项是在打开Web应用程序的时候配置检查:

  1. 检查Web应用程序中web.config中的debug是否值为true:
    <system.web>
        <compilation debug="true">
            <!--
            注意,compilation中debug属性要设置为true
            如果你没有设置true,在Debug模式下,启动调试,VS会提示你是否启用
            这个配置和IIS中配置启用调试是相同的.
             -->
        </compilation>
    </system.web>
    

一般检查完上面这些配置项,在Visual Studio中使用IIS调试应该就能正常进行了,如果还有问题,欢迎讨论。

 

附注:

[1]对于注册表设置项的操作可参见微软官方文档: http://support.microsoft.com/kb/896861

[揭秘]防辐射眼镜真的有防辐射能力吗

MitchellChu 2013-06-13 科技前瞻 网络锁事 万象漫谈

防辐射眼镜警告:防辐射眼镜真能防辐射吗?  前阵子可能看电脑看的太多,,疼痛严重,伴随与此的还有脑袋有晕晕的,有些影响工作。后听说可以买防辐射眼镜,就去搜了一阵子,但这防辐射眼镜的价钱天上地下的,而防辐射这事咱又区分不出个好坏来,于是乎,在经过这么瞎搜索了一下,就没有下文了,但得出了结论 —— 要找个防辐射眼镜还真是难找。最近这些日子赶东西也没有在乎这眼睛是不是疲劳了,愣是挺到了现在。

  这人呢,没大问题的时候就当啥事没有,拖着过,要出事了,这就开始惦记着当时没大问题的时候怎么就没给处理了,我就这样的人。这两天眼睛开始造反了,别说看东西了,就不看东西都痛。这眼睛痛着的时候,自然开始惦记起前阵子的防辐射眼镜来了。思量着前阵子要是把这防辐射眼镜给弄回来了该多好啊,于是,咬牙决定这一定要拿下,但本人天生不爱动弹,这要让我上实体眼镜店去配个防辐射的眼睛,明显不太现实嘛。痛定思痛,一鼓作气,咱又一头扎入网海,淘防辐射眼镜去,不淘个回来咱就不下火线。

  可是真要淘这眼镜,还是不懂啊,对于防辐射的效能,品牌什么的一窍不通。光防辐射的眼睛就有神码蓝光膜,绿光膜,红光膜,紫光膜等等各种镀膜,但是这膜干嘛用的,咱不懂。找度娘摸股沟都不能解决问题,看了一堆的的“资料”下来,不是在吹嘘品牌的软文,就是在煞有其事的讨论各种品牌的效果——随着云技术的不断发展深入,这伙人也深得其精髓,能把好多了忽悠的云里雾里了,但就是鲜有干货出现,这对于我这求知欲比较强烈的技术控来说,完全无法满足。在几经折腾,终于发现这膜原来叫增透膜(Anti-reflective coating)[1],而作用是用来增加镜片的通透性的,就是说,这玩意儿是增加光通过镜片的比率用的。这瞬间让我崩溃,好好的想找个比较各种镀膜的防辐射能力的技术帖子,好让我决定选什么镀膜的防辐射眼镜,结果却找出了镀膜原来根本就不是用来防辐射的这事,接受不了啊!  

  难道没有防辐射眼镜这东西?不甘心自然要继续搜寻,黄天不负有心人,终于给找到了,眼镜的确在有些品种中能够起到防辐射的作用,这种防辐射防的是波,当然不是声波,而是电磁波。就是利用在眼镜中增加反射膜以及在眼镜的镜片中添加各种化学物质来起到干扰电磁波的正常传播过程[2],这种眼镜的理想状态是将所有可见电磁波保留,而将不可见部分的电磁波悉数拦截。这其中最先被拦截的电磁波据说是紫外线光,因为在可见光边缘,而且能量较大(光谱中越左边,能量越大),拦截了,自然就是防紫外线辐射了。但理想和现实总是有那么一点距离,在防辐射眼镜中这距离还很大:其一,当前根本就没有一种产品可以达到100%将光波穿过镜片,增透膜的出现就是为增加光波透过率,但也无法做到100%;其二,即使在眼镜镜片中添加化学物质也好,贴上反射膜也罢,都只能拦截光波中的一小部分频率的,而大部分的波还是轻松的通过;其三,鱼和熊掌不可兼得,第一第二点在当前的技术工艺条件下,同样存在矛盾。从这样看来,非常明确的答案就是,确实存在防辐射眼镜,这对于我来说,好啊,总算没有白找,看来这防辐射还不是吹的,但紧接着,在另外一个文章中,我看到:如果长时间使用含有过滤某种颜色光的眼镜,带久了会出现的问题是会让自己的眼睛丧失对这种颜色的辨别能力,也就是说还有可能产生色弱或者色盲[4]。这个,纠结啊!。。。

  好吧,本来只是很简单的一个事情,就是买个防辐射眼镜嘛,可搞到现在,自己却是如此纠结。咱为了自己的福利,有必要暂停,回归本质,这样才能更高效,即便是选择防辐射眼镜也能更好的作出选择。这里忽略搜寻资料时间若干,直接放出下面成果,为了方便,给出关键词,并给出了解到的结果。

  看电脑看久了:就是普通的视觉疲劳嘛,和辐射神码的没有太大的关系,主要是人过于集中的看东西,让自己眼睛超负荷运转了;

  电脑屏幕辐射对人影响大吗?这个找了很多文章都没有直接的科学依据说明电脑辐射对人身体的危害程度达到何种程度,而普遍的认识是电脑的辐射并不会真正的影响我们的生活.[3]

  防辐射眼镜:如前所述,能起到一定作用,这个功能在国内非常流行,在国外市场所谓的防辐射眼镜基本绝迹,洋人不屑啊!而维基百科中也没有防辐射眼镜的词条,国内百科确实有[4],但后面防辐射率达到99.9%明显是骗人,第一,防辐射率首先必须要指明针对某种特定的对象,其二,数据来源并不可考。另外好些文章为了证明其真实度,杜撰出国防委检测说防辐射率为XX.X%,这其中漏洞同样非常明显,除了前面说的两点,还有就是这个国防委到底是什么组织?国家防务委员会,还是国际防务委员会 —— 当然,经过确认,中国是没有这种机构了,中国最接近的机构应该是中国辐射防护研究院,而国际上最接近的是国际放射防护委员会。即便是后者和国防委如此接近,我也没有找到任何文献说人家给咱中国的眼镜做了检测,而且防辐射率能够达到99.9%。这两个机构最先开始是专注核能辐射方面的,你想想人家是干多大事情的人,有时间特地检测咱中国市场上防辐射眼镜?最后,还有一个记者采访的[5],人家直接都说了,被访者明确指出,国家现在对于保健型眼镜根本就没有检测标准,这个再次验证,所谓的防辐射率为99.9%是纯属瞎扯淡。还有浙江省医学会也有类似文章[6],在中央政府网站上2012年10月30日也有篇科普文章,人家明确说防辐射眼镜难防辐射![7]

  我要解决的问题就是看电脑看久了,眼睛痛的问题,但从上面的结果看,不靠谱啊,之前还一直以为防辐射眼镜是个全球流行的眼镜品种——至少我看了很多品牌的介绍是这么以为的了,但现实是国际上鲜有什么防辐射眼镜出现,只有这中国这块神奇的土地上这么疯狂的热销着;之前又还以为防辐射眼镜这些功能描述都是真真切切的据实描述,但经过自己搜索下来,都是在偷换概念,忽悠群众。我为了比较这么个防辐射眼镜花去大把时间,到最后幸亏由于无法比较才深入了解,因此得以发现这其中的水深莫测,这防辐射眼镜就一坑爹的货色。我暗自庆幸啊,不然花去几百人民币事小,最后把自己眼睛真给整成色弱,色盲啥的就得不偿失了。

  折腾了这么多时间,我最终还是放弃了防辐射眼镜,毅然决然地放弃,并不是它有没有效果的问题,而是这种保健型的没有国标,他可以瞎胡闹,瞎折腾,而对消费者来说,在这种产品面前,无非就是小白鼠。眼睛疲劳产生疼痛,防辐射眼镜不能真正解决这个问题,而且还有未知的风险。回过头来想想,这其实是件很简单的事情,而且有很多方法就能解决(休息就是其一,而且是核心),没必要把简单的事情复杂化,风险化。——So,防辐射眼镜,对不住了。BTW:我真的不是专业黑!

 

附注,本文参考的资料包含但不限于以下这些

[1] 维基百科Anti-reflective coating百度百科增透膜

[2] 镜片中添加的物质随功能要求不同而有所不同,如汽车眼镜使用的可能有溴化银,氯化银等

[3] 来自果壳的孕妇要不要穿防辐射服?   洗脸+仙人掌,防电脑辐射?

[4] 百度百科防辐射眼镜

[5]沈阳日报: 2010年12月15日质量检测无国标 说好说坏商家定 选防辐射眼镜还得悠着点

[6] 浙江省医学会:上网眼镜热销,真能防辐射吗?

[7]中华人民共和国中央人民政府:科学生活:“防辐射眼镜”难防辐射

[8]百度百科:电磁辐射防护规定

[9]中华人民共和国环境保护部电磁辐射防护规定 ,更多

 

Windows和Linux下的关机重启命令

MitchellChu 2013-06-02 其他技术 Unix & Linux

新Linux的吉祥物Logo  MitchellChu从零开始学Linux,开始学的时候,最基本的还是要学会怎么开机关机啊,要是关机/重启这种都不会,说出去也没有人相信我学习过Linux的呀。

  在Linux下面,和重启的命令非常多,不像Windows,要学重启关机的命令,一个shutdown就全部搞定,当然,Windows下有shutdown,那Linux下是不是也有shutdown?——所以,非常自然的我学到的第一个命令是shutdown了。

   下shutdown还是相当的简单的:

REM 重启使用/r或-r参数
REM /t或-t指示多少时间之后执行(单位:s)
REM 如:/t xxx 指示xxx秒后执行
REM 如果不指定/t参数,则系统默认在60s后执行操作
REM 下面是在5s后重启系统
shutdown /r /t 5

REM 关机使用/s 或-s参数
REM 同样可以使用/t或-t参数
REM 下面指令是在5s之后关闭当前系统
shutdown -s -t 5

REM 要取消当前的shutdown指定的操作可以使用/a 或-a参数
REM 下面指令执行取消当前所有的shutdown 操作
shutdown -a

  在Windows下,你有这个命令,关机不求人,如果是服务器版本的话,可能会需要更多的参数,具体的可参见官方文档或在cmd下查看帮助。

  Linux下的关机重启命令比Windows下的多的多了,而且因为在Linux下更多的是使用文本界面(终端界面),因此,命令要比Windows更深入了解才行。首先对应的是Linux下的shutdown命令。先看看关机重启命令在Linux下怎么写的:

#shutdown 和Windows下的这个命令非常类似,因此也就比较类比学习了
#Linux下的shutdown命令格式:
#shutdown [OPTION]... TIME [MESSAGE]
#重启使用-r参数
#如果不给定TIME,shutdown无法执行
#TIME使用的是分钟,而Windows使用的是秒钟,这是个区别

shutdown -r 10 #系统在10分钟之后重启

#关机使用-P参数
#-P参数是关机&关闭电源
#这个和Windows下的shutdown -s类似

shutdown -P now #立即关机并切断电源

#如果只是关闭CPU,而不关闭电源,就是用-H参数

shutdown -H 1 System is going down in 1 minute! save your works Pls. #1分钟后关闭系统CPU
#The system...之后的是Message信息,会发送到各个登录的用户界面中提醒用户注意保存工作

#取消shutdown命令
shutdown -c #取消shutdown的操作

当然,如果是在当前的文本模式窗口输入的命令,因为是前台执行,如果要取消,也可以直接Ctrl + C,终止命令的执行。

在知道shutdown的基本用法之后,我们来看看它的所有参数

shutdown

shutdown命令的工作实质是给init程序发送信号(signal),要求其切换系统的运行级别(Runlevel)。系统的运行级别包括:

0:关闭系统

1:单用户模式,如果没有为shutdown命令指定-h或-r参数而直接执行,则默认将切换到此运行级别

2:多用户模式(不支持NFS)

3:多用户模式(支持NFS),一般常用此种运行级别

5:多用户模式(GUI模式)

6:重新启动系统

shutdown -参数 时间 讯息

-k:并非真正关机,只是送出讯息
-r:关机后重新开机
-h:关机后不重新开机
-f:快速关机
-n:快速关机,不要经过init的程序
-c:取消关时的程序
-t:在警告讯息和删除信号间做停留
时间可用now或任意数字 (代表分钟)

注意:这里是网上找到的比较老的一些参数。

 但是我当前CentOS的版本为6.4,参数有所不同:

Linux CentOS shutdown 命令

 

reboot

快速重启,类似于Ctrl + ALT +DEL

说明:若系统的 runlevel 为 0 或 6 ,则重新开机,否则以 shutdown 指令(加上 -r 参数)来取代

reboot -参数
参数:
-n : 在重开机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止
参数可选

Linux CentOS reboot命令

 CentOS 6.4中的参数

halt

  说明:若系统的 runlevel 为 0 或 6 ,则关闭系统,否则以 shutdown 指令(加上 -h 参数)来取代。halt执行时,杀死应用进程,文件系统写操作完成后就会停止内核。

halt -参数
参数:
-n : 在关机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的关机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫关机,不呼叫 shutdown 这个指令
-i : 在关机之前先把所有网络相关的装置先停止
-p : 当关机的时候,顺便做关闭电源(poweroff)的动作
参数可选

 Linux CentOS halt命令

CentOS 6.4参数

poweroff

  参见reboot命令。

Linux CentOS poweroff 命令

init

  init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel)。init 0命令用于立即将系统运行级别切换为0,即关机;init 6命令用于将系统运行级别切换为6,即重新启动。

init 参数
这里参数为0~6,其中0为关机,具体参见shutdown

Linux CentOS init 命令 

CentOS 6.4参数

 命令都在上面列出来了,同时各个命令之间的关系也用下图标出:

Linux CentOS 各个重启关机的命令之间的关系

Javascript开源前端框架/库汇总

MitchellChu 2013-06-01 HTML&HTML5 Javascript(s) 编程语言

Javascript框架和库   由于Web的富客户端界面交互日趋复杂,很多老牌的开源框架/库和众多新生的开源框架/库都不断的推出越来越强劲的产品,而恰好现在又正处于HTML4到HTML5和CSS2到CSS3的转移当口,更加加剧了这种框架和库的更新迭代,可以说,当前Javascript的各种和开源框架正处于百家争鸣的阶段。那么身处这个阶段的开发人员自然也不能错过如此好的学习机会。下面就是当前比较流行的一些框架,并对其进行分类[1]

封装型
典型代表:jQueryMooToolsTangram

jQuery 和 MooTools都是老牌的,Tangram是国内百度提供的框架。

特点:只针对“封装原生API”这一块,有插件机制,如jQuery UI组件库。但通常不提供任何架构方面的帮助。更多的是和架构类的轻量框架搭配使用

传统型
典型代表:DojoYUIClosure LibraryExtJSKISSYNEJJX

YUI 和Closure Library分别为Yahoo和Google提供,ExtJS在富客户端的表现比较出色,但现在越来越臃肿。KISSY为国内阿里的框架,NEJ为网易发布的,JX是腾讯提供的框架。

特点:支付宝玉伯被比喻为“大教堂风格”。稳定,覆盖广,代码风格和质量一致,文档丰富详细,更新稳重、缓慢,具有排他性,一旦选择很难替换,通常带有UI组件库

开放型
典型代表:ComponentAraleOz

Component为Node.js(一个非常有名的服务端)开发者中的TJ Holowaychuck牵头开发的框架,Arale为阿里系,Oz为豆瓣发布。

特点:被比喻为“集市风格”。专注于提供开放的基础架构,使用者可以灵活书写模块或整合第三方的库,以适应不同类型的架构需求,解耦性好。

单页应用型
典型代表:Backbone.jsEmber.jsAngularJSKnockout.js

特点:服务器请求数少、UI反应快、用户体验流畅,但对模式、View处理等具体实现方式的观点不一。一些传统型框架如Dojo、YUI、ExtJS也都开始引入MVC单页应用架构。

其他值得关注
Flight:Twitter开源前端框架,介于单页应用型和开放型之间,核心是事件驱动的、基于DOM的组件机制

 

[1] 参考的是程序员杂志开源前段框架纵横谈:http://www.programmer.com.cn/15552/

[2]Twitter还有很多开源的项目,所有的开源项目被放在Twitter Open Source

CentOS网络配置相关文件配置选项说明

MitchellChu 2013-06-01 其他技术 Unix & Linux

修改IP地址等网络相关的配置文件

找到对应网卡的IP地址配置文件:ifcfg-eth数字.

路径:/etc/sysconfig/network-scripts/ifcfg-eth数字

文件内配置项说明

DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth0
BOOTPROTO=static #设置网卡获得ip地址的方式,选项有:static(静态),dhcp(通过DHCP获取IP)或bootp(使用BOOTP协议获得IP)
BROADCAST=192.168.0.255 #子网广播地址
HWADDR=00:17:F3:05:18:20 #网卡物理地址(MAC)
IPADDR=192.168.0.2 #BOOTPROTO=static时,使用此IP地址
IPV6INIT=no #初始化IPv6的功能
IPV6_AUTOCONF=no #是否自动化配置IPv6
NETMASK=255.255.255.0 #网卡对应的网络掩码
NETWORK=192.168.1.0 #网卡对应的网络地址
ONBOOT=yes #系统启动时是否启用此设备,yes时,系统启动时激活
#TYPE=Ethernet #网络类型
#USERCTL=no #非root用户是否可控制该设备

2014年03月18日补充更新:NETWORK这个参数在CentOS中不要设置,官方已经弃用,并且在设置之后可能会出现不能成功添加网关的问题,可以参见最新的博文:CentOS网络配置中NETWORK设置后引起的问题.

CentOS官方帮助:http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-networkscripts-interfaces.html

 

CentOS 网关配置相关的配置文件
路径: /etc/sysconfig/network

文件内配置项说明

NETWORKING=yes # 表示系统是否使用网络,一般为yes。如果为no,则不使用网络,很多系统服务无法启动
#NETWORKING_IPV6=no #是否启用IPv6
#FORWARD_IPV4=no #是否开启IP转发功能
#HOSTNAME=localhost.localdomain #设置本机的主机名,设置的值要和/etc/hosts中设置的主机名对应;注释掉,一般先解析主机名或者域名,再解析DNS
GATEWAY=192.168.1.1 #设置网关的IP地址
#GATEWAYDEV=gateway #网关设备名称

CentOS 官方帮助:http://www.centos.org/docs/5/html/5.2/Deployment_Guide/s2-sysconfig-network.html

 

CentOS DNS相关的的
路径:/etc/resolv.conf

文件内配置项说明

#最重要的就是nameserver,其他可以忽略
nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器
#search mitchellchu.com www.mitchellchu.com #定义域名的搜索列表
#domain mitchellchu.com #定义本地域名
#sortlist #对返回的域名进行排序


网络设备重启
service network restart

/etc/init.d/network restart

IP地址修改
即时生效:
ifconfig eth0 192.168.0.2 netmask 255.255.255.0
重新启动网络设备后生效
参见 /etc/sysconfig/network-scripts/ifcfg-eth数字 的修改

修改当前网关 Default Gateway
即时生效:
route add default gw 192.168.0.1 dev eth0
重启网络设备后生效:
参见:/etc/sysconfig/network的配置

修改DNS
参见:/etc/resolv.conf配置
修改后即时生效

修改主机名
即时生效:
hostname centos1
重新启动生效:
参见:/etc/sysconfig/network配置,注意这里还有/etc/hosts的配置

的CentOS官方帮助:http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-networkscripts.html

IIS6 404自定义错误页面带来乱码的处理方法

MitchellChu 2013-06-01 .NET技术 其他技术

Bug logo  ASP.NET MVC在上绝少出现因为文件编码问题而导致的乱码问题,即使出现,也可以通过web.config的配置或者修改文件编码来解决,然而今天碰到的这例,却无法使用这些方法来解决,无论怎么修改,乱码依旧。让人懊恼不已!

  问题是这样的:ASP.NET MVC2在IIS6上进行部署,由于系统还有一些暂时未能完全使用MVC架构的代码存在,就利用了IIS6中的URL重定向机制,将404错误页面转发回系统页面进行处理,在系统中进行判定页面是否不存在或者重新配置页面地址重定向,让MVC Routing能够进行处理。想法是不错的,处理英文的时候也是非常顺畅的,但碰到中文的时候,系统就情不自禁的抽起疯来,根本就无法达到预期的效果。—— 一查,参数未解码的时候中文编码都是%ufffd,一解码全是乱码,能达到预期效果反而奇怪了!

  开始以为是配置上问题,检查了下config文件,发现request和response的Encoding都是UTF8,进而检查文件编码,也是UTF8,这和配置中的编码一致。理论上这样乱码应该不存在的,但理论往往和实际相差甚远!只好进一步检查,在历尽千辛万苦,最后发现问题原来出现在IIS的URL重定向上。当访问一个不存在的页面(含中文参数),IIS6会触发404错误,并将产生错误的内容重定向到指定的URL上,目标页面获取参数信息,但在处理中文时,需要进行解码,但根据IIS6定向过来的内容解码就会出现乱码,这就导致组合后的新地址经过MVC 路由后,无法正确的加载指定功能 —— 参数不对。

  以前我一直的说法是找到问题就是成功解决问题的关键,这话的确没错,接下来要解决它,只需要找到为什么IIS6传递过来的内容会出现解码错误即可。然而,随着进一步的检查发现,问题远没有想象的那么简单,IIS6.0在处理字串的时候默认使用的是(注:这里比较乱,有说GBK,也有说GB2312,还有说是ASCII,谁知道请告诉我,IIS6使用的默认编码是什么?这里用Unicode)。这个编码和我们有什么关系么?—— 我现在是没有想出具体的关系的,但是肯定是有关系的。以下为本人观点,猜测成分比较大,如果你有更详细的这方面资料请分享,将非常感激。

  在我们站点都使用UTF8的时候—— 这里我们需要补充个基础知识,UTF8的字符集是明显大于Unicode编码的。当IIS6检测到错误的时候,需要将UTF8转为IIS6的编码,并进行封装再转交给我们站点内处理,由于IIS6使用的是Unicode编码,在将UTF8字串转为Unicode时,因为字符集不够,所以出现无法转换现象,在无法转换是,系统用%ufffd来表示未能转换的字符。因此使用Unicode处理数据,再转交给站点内模块,程序设置为UTF8编码,UTF8去解码Unicode编码字串,结果可想而知,解码出来的中文自然而然就是乱码。这个思路大概用下面的图来概括(注:图中用的是GBK表示)

IIS6.0 自定义错误页面的处理流程示意图

这个图片描述的可能有误,但迄今为止尝试了很多各种编码的组合方式,都没有很好的将中文转成在程序中获取到的那种样子,所以也不能确定到底IIS6使用的是什么东西。

  解决方法网上有提供一些,但他们能真正的解决问题吗?

  1. 最多人的建议是使用UrlEncode方法将所有的中文进行编码之后传到服务端。

  但这种方法对于自定义错误页面的方法根本就无法解决。IIS6同样会将URL中的中文变成乱码。

  2. 另一种比较多的方法是在BeginRequest事件中处理,用Encoding去尝试转码来解决编码问题。

  个人认为这个方法也没能真正解决问题,因为我们一旦获取到的是%ufffd这种的参数时,就意味着我们的参数已经出现问题了。再说,这个方法和前一种方法一样,真正错误的是在IIS6中的自定错误页面过来的参数,在这之前已经出现错误,后面怎么弥补都无济于事。

  调试可以发现,在Request对象中,虽然QueryString,Url中的所有的都是乱码,但是RawUrl是正常的。如下图:

IIS6自定义错误页面跳转过来时出现乱码

  经过多次的测试发现,如果要比较好的解决这个问题,可以使用以下两种方法:

  1. 如果真的要在BeginRequest中处理乱码——当然,你也可以在你需要获取参数的时候进行处理,使用RawUrl。因为只有这个参数能够完整的保留中文信息。

  2. 对当前处理逻辑调整,直接处理掉可以处理的页面内容,而不要依赖IIS6的自定义错误页面来解决在程序中原本是非错误的页面,比如:数据库中页面,先要进行404跳转之后,再进入指定页面再来处理,这种处理方式比较闹心,但当下却还是有一些在用,我这篇文章就是这么来的。 

  当然了,上面的建议都是理想状态的,对于现存的项目来说,要实现不是一时半会,还需要仔细斟酌。针对我当前特定版本的解决方法,项目是MVC的,直接在Route中添加了对应规则,让这些都转入指定的模块中"销毁"吧,这和上述第二点原理一样,但却治不了根。 

  根据网上的一些信息综合起来看,这个问题应该是出自IIS6内部,不仅是中文,就连很多国际友人在做开发的时候也碰到过各种各样的Unicode Problem。有些反馈是说在IIS7下面没有这种现象,这个我没有测试,如果哪位有条件的可以测试下。

 

  问题暂时解决了,可以先休息会,毕竟这个问题折腾了我好几天啊!

 

参考:

CSDN 设置404页面所导致的乱码问题的帖子: http://bbs.csdn.net/topics/390358009

IIS.NET上面关于Unicode字符丢失的帖子:http://forums.iis.net/t/1085091.aspx/1

 

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。