<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Sai~</title><subtitle type="text">我是浪客～</subtitle><id>http://feed.cnblogs.com/blog/u/40024/rss</id><updated>2011-01-21T06:36:16Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/40024/rss"/><entry><id>http://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html</id><title type="text">SQL Server 监控系列 —— 二</title><summary type="text">监控前言 上一节我们提到了MSSQL的基于SQL Event的监控，但是有些时候我们需要更加详细、适用于调优排错的监控。SQL Server内部运行的可见性是的查询调整、优化和综合排查成为可能！这一节主要和大家说说SQL Server跟踪（SQL Server Profile）的一些监控方式和途径。 使用场景 记得某次给一家公司调优的时候，负责人发给我一堆业务的T-SQL脚本，我面对海量脚本还是从容，虽然不了解内部复杂的业务，但是我们得专注问题的关键 “慢”，我们根据查询的“慢”把他们筛选出来，一一调式优化，不就迅速解决问题吗？三天后，负责人含泪握着我的手，哥们辛苦了，查询响应得到了质的改善。</summary><published>2011-01-20T16:18:00Z</published><updated>2011-01-20T16:18:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;监控前言&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp; &lt;font color="#000000" size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2011/01/19/1939190.html" target="_blank"&gt;&lt;font color="#000000" size="2"&gt;上一节&lt;/font&gt;&lt;/a&gt;我们提到了MSSQL的基于&lt;font color="#0000ff"&gt;SQL Event&lt;/font&gt;的监控，但是有些时候我们需要更加&lt;font color="#0000ff"&gt;详细&lt;/font&gt;、适用于&lt;font color="#0000ff"&gt;调优排错&lt;/font&gt;的监控。SQL Server内部运行的可见性是的查询调整、优化和综合排查成为可能！这一节主要和大家说说SQL Server跟踪（&lt;font color="#0000ff"&gt;SQL Server Profile&lt;/font&gt;）的一些监控方式和途径。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;使用场景&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 记得某次给一家公司调优的时候，负责人发给我一堆业务的T-SQL脚本，我面对海量脚本还是从容，虽然不了解内部复杂的业务，但是我们得专注问题的关键 &amp;#8220;慢&amp;#8221;，我们根据查询的&amp;#8220;慢&amp;#8221;把他们筛选出来，一一调式优化，不就迅速解决问题吗？三天后，负责人含泪握着我的手，哥们辛苦了，查询响应得到了质的改善。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#393939" size="3"&gt;&lt;strong&gt;跟踪提供者&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL Server 为我们两者提供跟踪的方式：一种是一个物理文件（可保存在本机或者UNC网络路径），一种是行集。对于后者大家应该比较熟悉&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016046587.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016054735.png" width="244" height="43" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这个工具在 SSMS 的 工具 &amp;#8211;&amp;gt; SQL Profile&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016068181.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="AB490696-8C76-4819-A08D-1D14E3E828BA" border="0" alt="AB490696-8C76-4819-A08D-1D14E3E828BA" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016065182.jpg" width="244" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;详细的我暂时不介绍，先说说两者的区别和类同点 DIFFAndSame(行集,文件提供者)。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;两者都是用类似Buffer来保存当前的事件数据，很明显是为了减少IO的压力，这样可以不阻塞和&lt;font color="#ff0000"&gt;尽量&lt;/font&gt;不遗漏 事件数据，当Buffer 到达一定量时候可能才会Flush到磁盘或者发送到网络的终端（客户端）显示监控行集。&lt;/li&gt;    &lt;li&gt;物理文件保存监控结果的方式的&lt;font color="#ff0000"&gt;&lt;strong&gt;重要保证&lt;/strong&gt;&lt;/font&gt;是&lt;font color="#0000ff"&gt;不能遗漏任何事件&lt;/font&gt;，一旦IO降速的时候，可能会影响到整个T-SQL的执行情况。&lt;/li&gt; &lt;/ul&gt;        &lt;span style="color: blue"&gt;    SELECT &lt;/span&gt;&lt;span style="color: gray"&gt;* &lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;&lt;span style="color: lime"&gt;sys&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: lime"&gt;dm_os_wait_stats &lt;/span&gt;&lt;span style="color: blue"&gt;WHERE &lt;/span&gt;&lt;span style="color: teal"&gt;wait_type &lt;/span&gt;&lt;span style="color: gray"&gt;IN (&lt;/span&gt;&lt;span style="color: red"&gt;'SQLTRACE_LOCK'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: red"&gt;'IO_COMPLETION'&lt;/span&gt;&lt;span style="color: gray"&gt;);&lt;/span&gt;    我使用这个语句来监控TRACE 和IO 完成对我当前机器的影响，我的某个客户的IO情况：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;table border="0" cellspacing="0" cellpadding="2" width="878"&gt;&lt;tbody&gt;    &lt;tr&gt;      &lt;td valign="top" width="127"&gt;        &lt;p align="center"&gt;wait_type&amp;nbsp; &lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="153"&gt;        &lt;p align="center"&gt;waiting_tasks_count &lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="184"&gt;        &lt;p align="center"&gt;wait_time_ms&lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="194"&gt;        &lt;p align="center"&gt;max_wait_time_ms &lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="218"&gt;        &lt;p align="center"&gt;signal_wait_time_ms          &lt;br /&gt;&lt;/p&gt;      &lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td valign="top" width="127"&gt;        &lt;p align="center"&gt;IO_COMPLETION&lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="153"&gt;        &lt;p align="center"&gt;66030898&lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="184"&gt;        &lt;p align="center"&gt;24377499&lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="194"&gt;        &lt;p align="center"&gt;3634&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="218"&gt;        &lt;p align="center"&gt;418960          &lt;br /&gt;&lt;/p&gt;      &lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td valign="top" width="127"&gt;        &lt;p align="center"&gt;SQLTRACE_LOCK&lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="153"&gt;        &lt;p align="center"&gt;12007 &lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="184"&gt;        &lt;p align="center"&gt;175943&lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="194"&gt;        &lt;p align="center"&gt;1001 &lt;/p&gt;      &lt;/td&gt;      &lt;td valign="top" width="218"&gt;        &lt;p align="center"&gt;1281&lt;/p&gt;      &lt;/td&gt;    &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;因为我进行了大量的过滤，因此这个值还是能够接受的，影响不是特别大。&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;行结果集的方式，其实也是我们最熟悉的，就是使用SQL Server Profile监控GUI 直接展现给我们看到的。但是，我是&lt;font color="#ff0000"&gt;&lt;strong&gt;非常不建议&lt;/strong&gt;&lt;/font&gt;使用的，首先如果Buffer满了，它有一定的延迟，可能会&lt;font color="#0000ff"&gt;抛弃事件&lt;/font&gt;已清空缓存区继续接受事件，而事件没有发送到Client，也没有写到物理文件，自然就丢失了。比如，SQL Server Profile 在DB服务器进行监控，因为高负载的机器再用来展示，很有可能就会丢失事件，另外物理文件方式，其实是接受一个足够大的Buffer，进行的大块写操作，性能是优于行集的。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016071345.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016088412.png" width="244" height="58" /&gt;&lt;/a&gt;（行集）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;保密性原则&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL Server的安全特性会自动过滤 包含隐私的数据，比如密码。我在我的SSMS中执行了如下的语句：&lt;/p&gt;&lt;span style="color: blue"&gt;EXEC &lt;/span&gt;&lt;span style="color: maroon"&gt;sp_password &lt;/span&gt;&lt;span style="color: red"&gt;'pp'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: red"&gt;'pp1'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: red"&gt;'sa'&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" face="Verdana"&gt;这是修改sa帐号密码的系统sp，我打开了SQL Server Profile &amp;#8211;&amp;gt; 选择了T-SQL 监控模版 &lt;/font&gt;&lt;/span&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016095164.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016106691.png" width="244" height="136" /&gt;&lt;/a&gt;然后执行上面的存储过程，监控结果：&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016114282.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016125494.png" width="244" height="50" /&gt;&lt;/a&gt;&lt;p&gt;监控结果：--*sp_password----------------------------&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#393939" size="3"&gt;&lt;strong&gt;SQL Server Profile &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用SQL Server Profile GUI工具还是很多优势，首先是减少了我们监控的复杂性，可以快速的建立监控，在&lt;font color="#0000ff"&gt;跟踪属性&lt;/font&gt;中，可以可以选择MSSQL为我们提供的模版，包括常用的T-SQL、T-SQL Duration、T-SQL Locks模版分别监控当前DB运行的所有查询，所有查询的耗时、所有的锁定状态。&lt;/p&gt;&lt;p&gt;在&lt;font color="#0000ff"&gt;跟踪属性&lt;/font&gt; &amp;#8211;&amp;gt; 选择&lt;font color="#0000ff"&gt;事件选择 &lt;/font&gt;&lt;font color="#000000"&gt;我们可以选择自己需要的事件，所有的事件在MSDN 都有定义&lt;/font&gt;-&amp;gt;单击&lt;font color="#0000ff"&gt;列筛选器 &lt;/font&gt;&lt;font color="#000000"&gt;可以自定义过滤，排序噪点干扰因素&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016149039.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016173481.png" width="244" height="187" /&gt;&lt;/a&gt;（我随便选择了一个耗时 = 500 微妙的过滤条件）&lt;/p&gt;&lt;p&gt;其他的模版大家可以自己看看MSDN 手册，自己尝试一下：&lt;a href="ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_4deptrbl/html/bb0f1620-b77f-4f04-8502-ca223fa68184.htm" target="_blank"&gt;SQL Server 2008 R2 本机&amp;nbsp; MSDN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;服务器端跟踪和物理方式收集&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL Server Profile 只是对一些存储过程的封装，我更倾向于，自己定义常用的脚本，将监控结果保存在本机，用来大量的分析和存档。&lt;/p&gt;&lt;p&gt;当然涉及4个存储过程，虽然设置过滤的脚本非常麻烦，但是SQL Server Profile 可以利用 &lt;font color="#0000ff"&gt;文件&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;导出&lt;/font&gt; 可以导出监控脚本意味着，我们不需要编写复杂的T-SQL 脚本，不过还是建议大家熟悉这几个存储过程：&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;sp_trace_create 定义跟踪 ，创建的跟踪会在&lt;span style="color: lime"&gt;sys&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: lime"&gt;traces&lt;font color="#000000"&gt;查询的到。&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;s_trace_setevent 设置监控事件&lt;/li&gt;  &lt;li&gt;sp_trace_setfilter 设置过滤&lt;/li&gt;  &lt;li&gt;sp_trace_setstatus 设置跟踪的状态&amp;nbsp; 常用的是&amp;nbsp; sp_trace_setstatus @traceid,0 停止功能 、sp_trace_setstatus @traceid,2 移除跟踪，这将导致sys.traces最终查询不到该跟踪&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;其实整个跟踪还是比较简单的。我这里有一个常用的脚本：&lt;/p&gt;&lt;p&gt;用来 监控超过指定秒数 和 数据库 的 批处理和存储过程 语句（超过5MB的文件，会执行ROLLOVER，根据文件名在后面添加类似_1,_2.trc的跟踪结果）：&lt;/p&gt;&lt;div class="csharpcode"&gt;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; [dbo].[sp_trace_sql_durtion]      @DatabaseName nvarchar(128),      @Seconds bigint,      @FilePath nvarchar(260)  &lt;span class="kwrd"&gt;AS&lt;/span&gt;  &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;  &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @rc &lt;span class="kwrd"&gt;int&lt;/span&gt;,@TraceID &lt;span class="kwrd"&gt;int&lt;/span&gt;,@MaxFileSize bigint;  &lt;span class="kwrd"&gt;SET&lt;/span&gt; @MaxFileSize = 5;  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_create @TraceID &lt;span class="kwrd"&gt;OUTPUT&lt;/span&gt;,2,@FilePath,@MaxFileSize,&lt;span class="kwrd"&gt;NULL&lt;/span&gt;;  &amp;nbsp;  &lt;span class="kwrd"&gt;IF&lt;/span&gt; @rc != 0       &lt;span class="kwrd"&gt;RETURN&lt;/span&gt;;  &amp;nbsp;  &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @&lt;span class="kwrd"&gt;On&lt;/span&gt; &lt;span class="kwrd"&gt;bit&lt;/span&gt;;  &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;On&lt;/span&gt; = 1;  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID,10,35,@&lt;span class="kwrd"&gt;On&lt;/span&gt;;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID,10,1,@&lt;span class="kwrd"&gt;On&lt;/span&gt;;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID,10,13,@&lt;span class="kwrd"&gt;On&lt;/span&gt;;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID,41,35,@&lt;span class="kwrd"&gt;On&lt;/span&gt;;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID,41,1,@&lt;span class="kwrd"&gt;On&lt;/span&gt;;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID,41,13,@&lt;span class="kwrd"&gt;On&lt;/span&gt;;  &amp;nbsp;  &lt;span class="kwrd"&gt;SET&lt;/span&gt; @Seconds = @Seconds * 1000000;  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setfilter @TraceID,13,0,4,@Seconds;  &amp;nbsp;  &lt;span class="kwrd"&gt;IF&lt;/span&gt; @DatabaseName &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;      &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setfilter @TraceID,35,0,0,@DatabaseName  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setstatus @TraceID,1  &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; TraceID = @TraceID;  &amp;nbsp;  END&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;参数非常的明了，数据库名称、执行事件超过多少秒、保存的路径。&lt;/p&gt;&lt;p&gt;当我们运行这个脚本一段事件以后，可以快速的发现大量耗时的T-SQL，我们可以通过&lt;/p&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: gray"&gt;* &lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;&lt;span style="color: lime"&gt;fn_trace_gettable&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;N'监控文件路径'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;1&lt;span style="color: gray"&gt;);&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" face="Verdana"&gt;来查看行方式的结果。&lt;/font&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" face="Verdana"&gt;同样的富有创造力的读者可以自己创建监控锁定，监控死锁等方式保存文件，但是我的建议是尽可能的减少噪音，也就是说我们要达到什么目地就&lt;/font&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" face="Verdana"&gt;建立什么功能，这样才能将大问题细化解决。&lt;/font&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" face="Verdana"&gt;在《Microsfot SQL Server 2005 技术内幕： T-SQL 程序设计》 中有一个正则，用来将类似的语句全部组合成，只有参数形式替换具体值&lt;/font&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" face="Verdana"&gt;的SQL CLR，但是我认为那个正则还有bug，等我空了给大家写一个，自己也能使用的更完善。&lt;/font&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;&lt;font color="#393939" size="3" face="Verdana"&gt;&lt;strong&gt;监控异常&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;    在上个系列中，讲述了具体的SQL Event抓去的异常，可以及时通知，但是具体的异常信息，并不是特别详细。因此我们可以选择事件中的Error来添加有关T-SQL批处理和SP的所有异常，用于分析，这个跟踪非常有利于我们监控一些异常情况！！！我创建了一个跟踪的脚本，和上面的跟踪事件的脚本一样，超过5MB RollOver。    我们要定期的执行这个跟踪，虽然不建议长期开启，但是定期监控处理异常是有利我们系统更加长时间运作的。&lt;div class="csharpcode"&gt;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; [dbo].[sp_trace_sql_exception]      @FilePath nvarchar(260)  &lt;span class="kwrd"&gt;AS&lt;/span&gt;  &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @rc &lt;span class="kwrd"&gt;int&lt;/span&gt;,@TraceID &lt;span class="kwrd"&gt;int&lt;/span&gt;,@Maxfilesize bigint  &lt;span class="kwrd"&gt;SET&lt;/span&gt; @maxfilesize = 5   &amp;nbsp;  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; @rc = sp_trace_create @TraceID &lt;span class="kwrd"&gt;output&lt;/span&gt;, 2, @FilePath, @Maxfilesize, &lt;span class="kwrd"&gt;NULL&lt;/span&gt;   &lt;span class="kwrd"&gt;IF&lt;/span&gt; (@rc != 0)       &lt;span class="kwrd"&gt;RETURN&lt;/span&gt;;  &amp;nbsp;  &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @&lt;span class="kwrd"&gt;on&lt;/span&gt; &lt;span class="kwrd"&gt;bit&lt;/span&gt;  &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;on&lt;/span&gt; = 1  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 33, 1, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 33, 14, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 33, 51, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 33, 12, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 11, 2, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 11, 14, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 11, 51, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 11, 12, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 13, 1, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 13, 14, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 13, 51, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setevent @TraceID, 13, 12, @&lt;span class="kwrd"&gt;on&lt;/span&gt;  &amp;nbsp;  &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @intfilter &lt;span class="kwrd"&gt;int&lt;/span&gt;,@bigintfilter bigint;  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setstatus @TraceID, 1  &amp;nbsp;  &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; TraceID=@TraceID  &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; finish  &amp;nbsp;  ERROR:   &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; ErrorCode=@rc  &amp;nbsp;  FINISH: &lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&lt;font face="Courier New"&gt;定期执行吧，同志们，找异常。。。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#393939" size="3" face="Courier New"&gt;&lt;strong&gt;默认跟踪和黑盒跟踪&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在sys.traces中的TraceID = 1的跟踪是SQL Server 默认跟踪，这个跟踪比较轻量级，一般监控服务器的启用停止，对象的创建和删除，日志和数据文件自动增长以及其他数据库的变化。（监控那些没事删错了表的人，是最好的，当然前提不要都使用一个帐号！）&lt;/p&gt;&lt;p&gt;可以通过&lt;/p&gt;&lt;p&gt;EXEC sp_configure 'default trace enabled',0;&lt;/p&gt;&lt;p&gt;RECONFIGURE WITH OVERRIDE;&lt;/p&gt;&lt;p&gt;来关闭默认跟踪。&lt;/p&gt;&lt;p&gt;黑盒跟踪，就是可以帮助我们诊断数据库没事自个奔了的异常，在MSDN 搜索sp_create_trace的时候应该也发现了&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016176338.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101210016172467.png" width="244" height="25" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;的选项，那么我们也能创建一个类似的存储过程来快速的创建黑盒跟踪，帮助我们诊断一些异常！&lt;/p&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROCEDURE&lt;/span&gt; sp_trace_blackbox&lt;br/&gt;    @FilePath nvarchar(260)&lt;br/&gt;&lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @TraceID &lt;span class="kwrd"&gt;int&lt;/span&gt;,@MaxFileSize bigint&lt;br/&gt;    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @MaxFileSize = 25;&lt;br/&gt;    &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_create @TraceID &lt;span class="kwrd"&gt;OUTPUT&lt;/span&gt;,8,@FilePath,@MaxFileSize&lt;br/&gt;    &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_trace_setstatus @TraceID,1;&lt;br/&gt;&lt;br/&gt;END&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;我这里提供@FilePath = NULL参数，这个默认就保存在SQL Server的数据文件夹中。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;结尾&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 这里详细的描述了SQL Server Trace 的各种功能特性，有兴趣的朋友可以深入到MSDN研究监控，我这是也只是一笔带过，也参考了MSDN 和《Microsoft SQL Server 2005调优》那本书，下面的监控可能和大家讲述 DDL触发器监控，C2审核以及SQL Server的事件通知（涉及的Service Broker我会开一个系列和大家详细说说Service Broker），最后的结束可能就是说说2008的数据收集监控，大家期待吧。休息~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1939706.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2011/01/19/1939190.html</id><title type="text">SQL Server 监控系列 —— 一</title><summary type="text">作为DBA，不仅仅是帮助开发人员写优秀的查询脚本、高效的数据存储架构。其实更多时候都是在运维，大部分工作时间都不算饱和的,可是为什么有些DBA如此忙碌、狼狈不抗甚至等到客户或者乙方公司抱怨呢，那很多原因就是对SQL Server 的基础监控架构不熟悉，不够了解，不能自动化安排监控任务。 获取通知：SQL Server为我们提供的诸如SQL Mail，Database Mail 邮件方式的信息发送方式，因此我们利用邮件来进行最基础的获取通知异常等情况。我在之前的文章提过Databasemail，大家可以做为参考 MSSQL数据库邮件系列一(环境搭建) MSSQL数据库邮件系列二(SSMS和T</summary><published>2011-01-19T07:03:00Z</published><updated>2011-01-19T07:03:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/19/1939190.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/19/1939190.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 作为DBA，不仅仅是帮助开发人员写优秀的查询脚本、高效的数据存储架构。其实更多时候都是在运维，大部分工作时间都不算饱和的,可是为什么有些DBA如此忙碌、狼狈不抗甚至等到客户或者乙方公司抱怨呢，那很多原因就是对SQL Server 的基础监控架构不熟悉，不够了解，不能自动化安排监控任务。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;获取通知&lt;/font&gt;：SQL Server为我们提供的诸如SQL Mail，Database Mail 邮件方式的信息发送方式，因此我们利用邮件来进行最基础的获取通知异常等情况。我在之前的文章提过Databasemail，大家可以做为参考&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2009/09/27/1575329.html" target="_blank"&gt;MSSQL数据库邮件系列一(环境搭建)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2009/09/28/1576061.html" target="_blank"&gt;MSSQL数据库邮件系列二(SSMS和TSQL)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我提到了基本的邮件配置，但是也许我们的内网数据库是没有不能访问Internet的，如何发送到我们的监控邮箱呢。有朋友可能尝试会插入一个Mail表，然后在另外一台能否访问Internet的内网机器读取该表来发送邮件，其实我们可以通过简单的SMTP中继来实现，我们知道的SMTP其实是个推协议，一般是发送到提供商的STMP服务器，其实我们也能通过发送到自己的smtp服务器然后转发到指定DNS响应的SMTP服务器。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp; 我测试是Windows Server 2008的机器,我们来安装SMTP服务器。首先打开 &lt;/p&gt;  &lt;p&gt;1.服务器管理器 &amp;#8211;&amp;gt; 功能 &amp;#8211;&amp;gt; 添加功能 &amp;#8211;&amp;gt; SMTP 服务器。&lt;/p&gt;  &lt;p&gt;2.安装成功以后，在管理工具 &amp;#8211;&amp;gt; IIS (6.0） 管理器打开设置。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101191500015162.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="sqlmonitor_1" border="0" alt="sqlmonitor_1" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101191500011607.png" width="221" height="82" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;3.首先点击 域 &amp;#8211;&amp;gt; 新建域 &amp;#8211;&amp;gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101191500019131.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="sqlmonitor_2" border="0" alt="sqlmonitor_2" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/201101/201101191500012196.jpg" width="244" height="196" /&gt;&lt;/a&gt;（我新建了一个SMTP.QQ.COM的域，所以我要转发邮件到QQ邮箱）。&lt;/p&gt;  &lt;p&gt;我们看到QQ提供的SMTP.QQ.COM使用的标准的25端口。所以打开WF.MSC 去添加25端口的出站规则，同时打开入站规则的25（让DB服务器能够中继到该SMTP服务器），不关闭选项卡。&lt;/p&gt;  &lt;p&gt;4.在&amp;#8220;出站安全&amp;#8221;中-&amp;gt;选择&amp;#8220;基本身份验证&amp;#8221;-&amp;gt;添加你的邮箱登录帐号 &amp;#8211;&amp;gt;（TSL加密根据你SMTP服务器的规则）来设置。&lt;/p&gt;  &lt;p&gt;5.选中&amp;#8220;SMTP Virtual Server #1&amp;#8221; &amp;#8211;&amp;gt; 右键属性 &amp;#8211;&amp;gt; 切换到 &amp;#8220;访问&amp;#8221;选项卡 &amp;#8211;&amp;gt;在&amp;#8220;中继限制&amp;#8221;中单击&amp;#8220;中继&amp;#8221; 添加你对应机器的访问列表。&lt;/p&gt;  &lt;p&gt;6.最后一步，把你的DatabaseMail帐号设置成 匿名身份验证,SMTP服务器选择你的内网SMTP服务器地址，端口默认25，其他都不变动。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果发送测试邮件通过说明没问题了，搞不定可以搜搜资料吧，或者直接提问。那么我也就解决了第一个问题&amp;#8220;&lt;font color="#ff0000"&gt;我们如何获取通知&lt;/font&gt;&amp;#8221;，采用最基本的邮件方式。&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细的监控信息&lt;/font&gt;：数据库避免不了一些异常状态，比如错误的脚本导致的异常，空间不够，磁盘挂了，复制失败了等。这里我先提提SQL Server事件。这个意味着SQL Server发生特定错误产生的事件，每个事件都有对应的数据库、严重级别、错误号、错误文本。&lt;/p&gt;  &lt;p&gt;打开SSMS-&amp;gt;在SQL Server 代理 &amp;#8211;&amp;gt;的警告中可以创建警告。一般来说我们关注大于等于13严重级别的事件。为乙方公司提供服务时快速的部署也很重要，因此我整理了一些脚本：&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;span class="kwrd"&gt;USE&lt;/span&gt; [msdb]  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_13]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:44:53 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_13'&lt;/span&gt;,           @message_id=0,           @severity=13,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; [msdb]  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_14'&lt;/span&gt;,           @message_id=0,           @severity=14,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_15'&lt;/span&gt;,           @message_id=0,           @severity=15,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_16'&lt;/span&gt;,           @message_id=0,           @severity=16,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_17'&lt;/span&gt;,           @message_id=0,           @severity=17,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_18'&lt;/span&gt;,           @message_id=0,           @severity=18,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_19'&lt;/span&gt;,           @message_id=0,           @severity=19,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_20'&lt;/span&gt;,           @message_id=0,           @severity=20,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_21'&lt;/span&gt;,           @message_id=0,           @severity=21,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_22'&lt;/span&gt;,           @message_id=0,           @severity=22,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_23'&lt;/span&gt;,           @message_id=0,           @severity=23,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_24'&lt;/span&gt;,           @message_id=0,           @severity=24,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Alert [SQL_EVENT_17]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 12/08/2010 14:45:03 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_alert @name=N&lt;span class="str"&gt;'SQL_EVENT_25'&lt;/span&gt;,           @message_id=0,           @severity=25,           @enabled=1,           @delay_between_responses=1800,           @include_event_description_in=1,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;,           @job_id=N&lt;span class="str"&gt;'00000000-0000-0000-0000-000000000000'&lt;/span&gt;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;上面提供了 13-25严重级别的事件。有了事件，必然的，需要一个操作员或者说是监控人员来对获取事件来转发邮件，我们可以看到SQL Server 代理中 有 操作员的选项卡，可以创建操作员：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="csharpcode"&gt;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; [msdb]  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;nbsp;  /****** &lt;span class="kwrd"&gt;Object&lt;/span&gt;:  Operator [Terry Mao]    Script &lt;span class="kwrd"&gt;Date&lt;/span&gt;: 01/19/2011 11:37:34 ******/  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_operator @name=N&lt;span class="str"&gt;'Terry Mao'&lt;/span&gt;,           @enabled=1,           @weekday_pager_start_time=90000,           @weekday_pager_end_time=180000,           @saturday_pager_start_time=90000,           @saturday_pager_end_time=180000,           @sunday_pager_start_time=90000,           @sunday_pager_end_time=180000,           @pager_days=0,           @email_address=N&lt;span class="str"&gt;'10000@qq.com'&lt;/span&gt;,           @category_name=N&lt;span class="str"&gt;'[Uncategorized]'&lt;/span&gt;  GO&lt;/div&gt;&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;我添加了一个 &amp;#8220;Terry Mao&amp;#8221; 的操作人员,对应邮件地址为10000的邮件地址，然后我们可能需要为所有的事件添加订阅人员， 也就是Terry Mao。&lt;/p&gt;&lt;p&gt;在视图中，可以查询到所有创建的警报：&lt;/p&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.sysalerts;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;当然不可能一个去添加订阅事件，可以创建类似功能的sp：&lt;/p&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; dbo.sp_add_all_notification&lt;br/&gt;    @Operator sysname&lt;br/&gt;&lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @Name sysname,@OperatorID &lt;span class="kwrd"&gt;int&lt;/span&gt;;&lt;br/&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @OperatorID = id &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.sysoperators &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; name = @Operator;&lt;br/&gt;&lt;span class="kwrd"&gt;IF&lt;/span&gt; @OperatorID &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;RETURN&lt;/span&gt; -1;&lt;br/&gt;    &lt;br/&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; Cur &lt;span class="kwrd"&gt;CURSOR&lt;/span&gt; FAST_FORWARD READ_ONLY &lt;span class="kwrd"&gt;LOCAL&lt;/span&gt; &lt;span class="kwrd"&gt;FOR&lt;/span&gt; &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name] &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.sysalerts alters &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 1 &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.sysnotifications notify &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; notify.operator_id = @OperatorID &lt;span class="kwrd"&gt;AND&lt;/span&gt; notify.alert_id = alters.id);&lt;br/&gt;&lt;span class="kwrd"&gt;OPEN&lt;/span&gt; Cur;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;FETCH&lt;/span&gt; &lt;span class="kwrd"&gt;NEXT&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; Cur &lt;span class="kwrd"&gt;INTO&lt;/span&gt; @Name;&lt;br/&gt;&lt;span class="kwrd"&gt;WHILE&lt;/span&gt; &lt;span class="preproc"&gt;@@FETCH_STATUS&lt;/span&gt; = 0&lt;br/&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; msdb.dbo.sp_add_notification @alert_name = @Name,@operator_name = @Operator,@notification_method = 1;&lt;br/&gt;    &lt;span class="kwrd"&gt;FETCH&lt;/span&gt; &lt;span class="kwrd"&gt;NEXT&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; Cur &lt;span class="kwrd"&gt;INTO&lt;/span&gt; @Name;&lt;br/&gt;&lt;span class="kwrd"&gt;END&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;CLOSE&lt;/span&gt; Cur;&lt;br/&gt;&lt;span class="kwrd"&gt;DEALLOCATE&lt;/span&gt; Cur;&lt;br/&gt;&lt;span class="kwrd"&gt;RETURN&lt;/span&gt; 0;&lt;br/&gt;END&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;这样就会把所有的事件全部给监控起来，其实我就解决了过滤的监控列表，但是我们可能会对运行中的SQL Server 比如长时间执行的语句，存储过程进行监控来调优。比如，我们给另外一家公司做DBA顾问，就立马需要获取有问题的查询，这个我会在接下来的文章详细说明。其中包括Profile的监控，SQL Server WMI的监控等。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1939190.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2011/01/19/1939190.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2011/01/18/1938295.html</id><title type="text">SQL Server Assembly (SQL CLR) 还原数据库后的问题</title><summary type="text">前端时间给别人做迁移数据库时候,遇到一些问题.大致是,如果备份的数据库存在EXTERNAL_ACCESS 和UNSAFE的程序集,那么在还原的时候程序集会出现一些奇怪的错误: 消息 10314，级别 16，状态 11，第 1 行 在尝试加载程序集 ID 65536 时 Microsoft .NET Framework 出错。服务器可能资源不足，或者不信任该程序集，因为它的 PERMISSION_SET 设置为 EXTERNAL_ACCESS 或 UNSAFE。请重新运行查询，或检查有关的文档了解如何解决程序集信任问题。有关此错误的详细信息: System.IO.FileLoadExcepti</summary><published>2011-01-18T06:12:00Z</published><updated>2011-01-18T06:12:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/18/1938295.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/18/1938295.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前端时间给别人做迁移数据库时候,遇到一些问题.大致是,如果备份的数据库存在EXTERNAL_ACCESS 和UNSAFE的程序集,那么在还原的时候程序集会出现一些奇怪的错误:&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;消息 10314，级别 16，状态 11，第 1 行      &lt;br /&gt;在尝试加载程序集 ID 65536 时 Microsoft .NET Framework 出错。服务器可能资源不足，或者不信任该程序集，因为它的 PERMISSION_SET 设置为 EXTERNAL_ACCESS 或 UNSAFE。请重新运行查询，或检查有关的文档了解如何解决程序集信任问题。有关此错误的详细信息:       &lt;br /&gt;System.IO.FileLoadException: 未能加载文件或程序集&amp;#8220;testclr, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null&amp;#8221;或它的某一个依赖项。异常来自 HRESULT:0x80FC80F1       &lt;br /&gt;System.IO.FileLoadException:       &lt;br /&gt;&amp;nbsp;&amp;nbsp; 在 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark&amp;amp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)       &lt;br /&gt;&amp;nbsp;&amp;nbsp; 在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark&amp;amp; stackMark, Boolean forIntrospection)       &lt;br /&gt;&amp;nbsp;&amp;nbsp; 在 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark&amp;amp; stackMark, Boolean forIntrospection)       &lt;br /&gt;&amp;nbsp;&amp;nbsp; 在 System.Reflection.Assembly.Load(String assemblyString)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;至于产生的原因大概是,在备份数据库的时候,在机器A,那么数据库的拥有者是A\Administrator(如果用windows登录创建),那么但是我们还原到服务器B,那么拥有者可能是B\Administrator,那么SQL CLR的安全性会认为该程序集不可靠.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如:&lt;/p&gt;  &lt;p&gt;我首先创建一个简单的SQL CLR 存储过程:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;span class="kwrd"&gt;using&lt;/span&gt; System;  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlClient;  &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlTypes;  &lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.SqlServer.Server;  &amp;nbsp;  &amp;nbsp;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; StoredProcedures  {      [Microsoft.SqlServer.Server.SqlProcedure]      &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Test()      {          &lt;span class="rem"&gt;// 在此处放置代码&lt;/span&gt;      }  };&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;编译创建程序集.&lt;/p&gt;&lt;p&gt;在&lt;font color="#ff0000"&gt;机器A&lt;/font&gt;上的数据库上执行:&lt;/p&gt;&lt;div class="csharpcode"&gt;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; test;  &amp;nbsp;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; test;  &amp;nbsp;  &lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; test &lt;span class="kwrd"&gt;SET&lt;/span&gt; TRUSTWORTHY &lt;span class="kwrd"&gt;ON&lt;/span&gt;;  &amp;nbsp;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; ASSEMBLY [TestCLR] &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;span class="str"&gt;'E:\Documents\Visual Studio 2010\Projects\TestCLR\TestCLR\bin\Release\TestCLR.dll'&lt;/span&gt; &lt;span class="kwrd"&gt;WITH&lt;/span&gt; PERMISSION_SET = EXTERNAL_ACCESS;  --SAFE;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; dbo.usp_test  &lt;span class="kwrd"&gt;AS&lt;/span&gt;  &lt;span class="kwrd"&gt;EXTERNAL&lt;/span&gt; NAME [TestCLR].StoredProcedures.Test;  &amp;nbsp;  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; dbo.usp_test;  &amp;nbsp;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; master;  &amp;nbsp;  &lt;span class="kwrd"&gt;BACKUP&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; test &lt;span class="kwrd"&gt;TO&lt;/span&gt; &lt;span class="kwrd"&gt;DISK&lt;/span&gt; = &lt;span class="str"&gt;'c:\test.bak'&lt;/span&gt; &lt;span class="kwrd"&gt;WITH&lt;/span&gt; FORMAT;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;将c:\test.bak copy 到&lt;font color="#ff0000"&gt;机器B&lt;/font&gt;&lt;font color="#000000"&gt;上,然后执行:&lt;/font&gt;&lt;/p&gt;&lt;div class="csharpcode"&gt;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; [master];  --还原数据库  &lt;span class="kwrd"&gt;RESTORE&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; test &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;span class="kwrd"&gt;DISK&lt;/span&gt; = &lt;span class="str"&gt;'c:\test.bak'&lt;/span&gt; &lt;span class="kwrd"&gt;WITH&lt;/span&gt; RECOVERY,  MOVE &lt;span class="str"&gt;'test'&lt;/span&gt; &lt;span class="kwrd"&gt;TO&lt;/span&gt; &lt;span class="str"&gt;'E:\data\test.mdf'&lt;/span&gt;,  MOVE &lt;span class="str"&gt;'test_log'&lt;/span&gt; &lt;span class="kwrd"&gt;TO&lt;/span&gt; &lt;span class="str"&gt;'E:\data\test.ldf'&lt;/span&gt;,REPLACE;  &amp;nbsp;  --如果没有启用CLR,开启  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_configure &lt;span class="str"&gt;'clr enabled'&lt;/span&gt;,1  &lt;span class="kwrd"&gt;RECONFIGURE&lt;/span&gt; &lt;span class="kwrd"&gt;WITH&lt;/span&gt; OVERRIDE;  &amp;nbsp;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; test;  --查看程序集,是存在的.  &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; sys.assemblies;  &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; sys.assembly_files;  --还原之后的数据库TRUSTWORTHY 都是OFF的,需要重新设置  &lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; test &lt;span class="kwrd"&gt;SET&lt;/span&gt; TRUSTWORTHY &lt;span class="kwrd"&gt;ON&lt;/span&gt;;  &amp;nbsp;  &lt;span class="kwrd"&gt;USE&lt;/span&gt; test;  --执行存储过程  &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; dbo.usp_test;  &amp;nbsp;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&lt;font color="#000000"&gt;但是一执行就报错了.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;解决方案:&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;在还原数据库之后,我们可以将数据库的OWNER设置成SA.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;exec sp_changedbowner 'sa'&lt;/p&gt;&lt;p&gt;再调用存储过程就是成功的.&lt;/p&gt;&lt;p&gt;可以查看:KB &lt;a href="http://support.microsoft.com/kb/918040"&gt;http://support.microsoft.com/kb/918040&lt;/a&gt;&lt;/p&gt;&lt;p&gt;后来经过一些整理,发现当SQL CLR 存在EXTERNAL_ACCESS或者是UNSAFE的程序集的时候,SQL Server会检查DBO的SID在sys.databases 和sys.server_principals是否一致.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;因此我们可能未必一定要修改成sa 的,只要所有者的SID在sys.databases和sys.server_principals 是一致的,就不出问题.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们在SSMS里面右键数据库属性-&amp;gt;找到文件选项卡-&amp;gt;发现在所有者(是空的,还原以后原来的SID,数据库所有者在当前的sys.server_principals不匹配的),我们可以在 [...] 里面选择一个,具有创建CREATE ASSEMLY 权限的所有者就好,我选择了B\Administrator,然后测试 CLR 存储过程,没问题,&lt;/p&gt;&lt;p&gt;引深:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在SQL Server 复制里面也存在类似的问题,就是我们做 "对等复制" 的时候,会出现DBO不存在,以及sp_replcmd 不存在类似的错误.其实也是因为对等复制初始化订阅是通过 RESTORE 来实现的,因此只要简单的修改数据库所有者 就好了....那么对等复制的问题也就解决了!!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1938295.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2011/01/18/1938295.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2011/01/07/1929727.html</id><title type="text">下载文件 文件名 乱码的问题.</title><summary type="text">之前看到博友们一些文章解决asp.net的下载文件名的乱码,但是貌似针对其他浏览器比如Firefox的中文还是有乱码,空格出现+号(这时候IE,Chrome没问题) 刚才试了试,用这个方法可以搞定了IE,Chrome,Firefox.其他没测试,先贴上代码: 代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt;publicclassUrlEncoder{///&lt;summary&gt;///Encodesnon-US-ASCIIcharactersina</summary><published>2011-01-07T06:26:00Z</published><updated>2011-01-07T06:26:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/07/1929727.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2011/01/07/1929727.html"/><content type="html">&lt;p&gt;之前看到博友们一些文章解决asp.net的下载文件名的乱码,但是貌似针对其他浏览器比如Firefox的中文还是有乱码,空格出现+号(这时候IE,Chrome没问题)&lt;/p&gt;  &lt;p&gt;刚才试了试,用这个方法可以搞定了IE,Chrome,Firefox.其他没测试,先贴上代码:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('45187c78-3b86-4f22-a376-d36d59ab3e72')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_45187c78-3b86-4f22-a376-d36d59ab3e72" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_45187c78-3b86-4f22-a376-d36d59ab3e72" onclick="cnblogs_code_hide('45187c78-3b86-4f22-a376-d36d59ab3e72',event)" style="display:none"&gt;&lt;div id="cnblogs_code_open_45187c78-3b86-4f22-a376-d36d59ab3e72" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;UrlEncoder&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Encodes&amp;nbsp;non-US-ASCII&amp;nbsp;characters&amp;nbsp;in&amp;nbsp;a&amp;nbsp;string.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param&amp;nbsp;name="s"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ToHexString(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;s)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;chars&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;s.ToCharArray();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;builder&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;StringBuilder();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;chars.Length;&amp;nbsp;index&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;needToEncode&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NeedToEncode(chars[index]);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(needToEncode)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;encodedString&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ToHexString(chars[index]);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(encodedString);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(chars[index]);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;builder.ToString();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Determines&amp;nbsp;if&amp;nbsp;the&amp;nbsp;character&amp;nbsp;needs&amp;nbsp;to&amp;nbsp;be&amp;nbsp;encoded.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param&amp;nbsp;name="chr"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NeedToEncode(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;chr)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;reservedChars&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$-_.+!*'(),@=&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(chr&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;127&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IsLetterOrDigit(chr)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;reservedChars.IndexOf(chr)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Encodes&amp;nbsp;a&amp;nbsp;non-US-ASCII&amp;nbsp;character.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param&amp;nbsp;name="chr"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ToHexString(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;chr)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UTF8Encoding&amp;nbsp;utf8&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;UTF8Encoding();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;encodedBytes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;utf8.GetBytes(chr.ToString());&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;builder&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;StringBuilder();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;encodedBytes.Length;&amp;nbsp;index&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.AppendFormat(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;Convert.ToString(encodedBytes[index],&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;builder.ToString();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;然后在下载下面中:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('a2090484-397b-4b9e-b543-b013680dd005')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_a2090484-397b-4b9e-b543-b013680dd005" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_a2090484-397b-4b9e-b543-b013680dd005" onclick="cnblogs_code_hide('a2090484-397b-4b9e-b543-b013680dd005',event)" style="display:none"&gt;&lt;div id="cnblogs_code_open_a2090484-397b-4b9e-b543-b013680dd005" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;response.ContentType&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;application/octet-stream&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;response.HeaderEncoding&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Encoding.UTF8;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;encodefileName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;UrlEncoder.ToHexString(fileName);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;userAgent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;request.UserAgent.ToUpper();&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;fileNameHead&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(userAgent.IndexOf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FIREFOX&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileNameHead&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;attachment;filename*=utf8''{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;encodefileName);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileNameHead&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;attachment;filename={0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;encodefileName);&lt;br /&gt;response.AddHeader(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Disposition&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;fileNameHead);&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;就成了.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1929727.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2011/01/07/1929727.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2010/11/18/1880999.html</id><title type="text">Powershell 变量</title><summary type="text">本文主要和大家描述一下关于Powershell变量的详细内容,上回和大家聊到了Powershell的远程管理,有朋友反映Powershell的基础只是还不够了解,所以先谈谈在Powershell中的变量问题. 创建自己的变量 PS C:\Users\Terry&gt; $a = 1.2 那么我们就创建了一个名字为a的变量,注意Powershell 中变量都用美元符号"$"做为开始. PS C:\Users\Terry&gt; $b = 2.3 我们再次创建了一个为b的变量,两个变量是可以直接进行运算的,例如对他们进行一个乘操作. PS C:\Users\Terry&gt; $a*$b 2.76 很明显的</summary><published>2010-11-18T09:26:00Z</published><updated>2010-11-18T09:26:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/18/1880999.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/18/1880999.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文主要和大家描述一下关于Powershell变量的详细内容,上回和大家聊到了Powershell的远程管理,有朋友反映Powershell的基础只是还不够了解,所以先谈谈在Powershell中的变量问题.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;创建自己的变量&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $a = 1.2&lt;/font&gt;&amp;nbsp; 那么我们就创建了一个名字为a的变量,注意Powershell 中变量都用美元符号"$"做为开始.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $b = 2.3&lt;/font&gt; 我们再次创建了一个为b的变量,两个变量是可以直接进行运算的,例如对他们进行一个乘操作.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $a*$b      &lt;br /&gt;&lt;/font&gt;2.76&lt;/p&gt;  &lt;p&gt;很明显的,我们也可以对变量直接进行变量区间的传递赋值:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $c=$a*$b      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $c      &lt;br /&gt;&lt;/font&gt;2.76&lt;/p&gt;  &lt;p&gt;当使用字符串变量的时候,这里有一些小的技巧,大家可以注意了:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; "`$c=`$a*`$b equals $c"      &lt;br /&gt;&lt;/font&gt;$c=$a*$b equals 2.76&lt;/p&gt;  &lt;p&gt;在字符串""包围的区间要引用变量,可以很简单的,直接"$变量" 来表达我们的变量值,当我们需要转移$或者双引号等特殊字符使用我们通常使用"`"(1旁边那个键).&lt;/p&gt;  &lt;p&gt;接下来可以进行更复杂的运算,如果在字符串引用变量进行进一步运算:&lt;/p&gt;  &lt;p&gt;比如我们想在字符串中直接显示变量a和变量b的乘积值&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; "$a*$b"      &lt;br /&gt;&lt;/font&gt;1.2*2.3&lt;/p&gt;  &lt;p&gt;这样是不行的.&lt;/p&gt;  &lt;p&gt;通常我们使用&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; "$($a*$b)"      &lt;br /&gt;&lt;/font&gt;2.76&lt;/p&gt;  &lt;p&gt;来进行一个转换,同理的.&lt;/p&gt;  &lt;p&gt;我创建一个数组,然后求他的数组长度&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $arr=1,2,3,4      &lt;br /&gt;PS C:\Users\Terry&amp;gt; $arr       &lt;br /&gt;&lt;/font&gt;1     &lt;br /&gt;2     &lt;br /&gt;3     &lt;br /&gt;4     &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; "`$arr array length equals $arr.Length (this is error)"      &lt;br /&gt;&lt;/font&gt;$arr array length equals 1 2 3 4.Length (this is error)     &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; "`$arr array length equals $($arr.Length) (this is ok)"      &lt;br /&gt;&lt;/font&gt;$arr array length equals 4 (this is ok)&lt;/p&gt;  &lt;p&gt;如果我们的变量名比较复杂,存在空格,或者特殊字符,一般我们直接使用是会出错的,Powershell默认会使用空格或者一些特殊字符作为分解符号(DELIMITER)&lt;/p&gt;  &lt;p&gt;比如:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $a b=123      &lt;br /&gt;&lt;/font&gt;&lt;font color="#c0504d"&gt;表达式或语句中出现意外标记&amp;#8220;b=123&amp;#8221;。      &lt;br /&gt;所在位置 行:1 字符: 9       &lt;br /&gt;+ $a b=123 &amp;lt;&amp;lt;&amp;lt;&amp;lt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + CategoryInfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : ParserError: (b=123:String) [], ParentContainsErrorRecordException       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + FullyQualifiedErrorId : UnexpectedToken&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;这样创建一个$a b 的变量就有问题了.所以要使用{}来对变量名进行一个解析:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; ${a b}=123      &lt;br /&gt;PS C:\Users\Terry&amp;gt; ${a b}       &lt;br /&gt;&lt;/font&gt;123     &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; "${a b}"      &lt;br /&gt;&lt;/font&gt;123&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;变量返回值&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;当我们调用一些命令的时候,我们还可以把返回值直接赋予给变量.&lt;/p&gt;  &lt;p&gt;比如:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $ret = ls      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $ret&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 目录: C:\Users\Terry&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Length Name     &lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ------ ----     &lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010/11/15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10:43&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CMB     &lt;br /&gt;d-r--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010/11/4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 19:18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Desktop     &lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010/11/18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 15:23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tracing     &lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010/11/16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 16:24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11544 a     &lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010/11/13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14:30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21466 function.ps1&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $ret.GetType()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;IsPublic IsSerial Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BaseType    &lt;br /&gt;-------- -------- ----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------     &lt;br /&gt;True&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; True&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Array&lt;/p&gt;  &lt;p&gt;我将枚举目录的结果直接返回给变量$ret,查看$ret的类型是Object[] 数组.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;Powershell变量魅力&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;一键赋值能力:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $a=$b=$c=1      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $a      &lt;br /&gt;&lt;/font&gt;1     &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $b      &lt;br /&gt;&lt;/font&gt;1     &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $c      &lt;br /&gt;&lt;/font&gt;1&lt;/p&gt;  &lt;p&gt;变量交换能力:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $a=1;$b=2      &lt;br /&gt;PS C:\Users\Terry&amp;gt; $a,$b=$b,$a       &lt;br /&gt;PS C:\Users\Terry&amp;gt; "$a $b"       &lt;br /&gt;&lt;/font&gt;2 1&lt;/p&gt;  &lt;p&gt;使用Powershell还可以非常方便的访问文件&lt;/p&gt;  &lt;p&gt;比如我们在c:\根目录下创建一个1.txt 里面随便写入内容&lt;/p&gt;  &lt;p&gt;我们可以直接使用&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; ${c:\1.txt}      &lt;br /&gt;&lt;/font&gt;123123123&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $command = "`${$env:windir\windowsupdate.log}"      &lt;br /&gt;PS C:\Users\Terry&amp;gt; Invoke-Expression $command&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;来查看内部的内容,某些时候,我们可以用来查询windows日志:&lt;/p&gt;  &lt;p&gt;这里有一个小技巧,我们直接使用环境变量$env:windir再在外部使用$来打开文件时候是不能正确解析的,他会被当作变量名的文件路径了&lt;/p&gt;  &lt;p&gt;所以我们要把调用的命令解析成可执行的方式交给Invoke_Expression 来使用 . &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;维护Powershell变量&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;首先是查找变量&lt;/p&gt;  &lt;p&gt;可以使用DIR/Get-ChildItem (是Alias对)&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; dir variable:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value    &lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----     &lt;br /&gt;$&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a $b     &lt;br /&gt;?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; True     &lt;br /&gt;^&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a $b     &lt;br /&gt;_     &lt;br /&gt;&lt;font color="#ff0000"&gt;a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2      &lt;br /&gt;a b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123       &lt;br /&gt;args&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {}       &lt;br /&gt;arr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {1, 2, 3, 4}       &lt;br /&gt;&lt;/font&gt;b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1     &lt;br /&gt;c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/p&gt;  &lt;p&gt;我们刚才创建的变量就可以看到了.&lt;/p&gt;  &lt;p&gt;当然具体的帮助大家可以看看Get-Help Get-ChildItem &amp;#8211;Full 看看如果进行-include和-exclude操作.当我们要查找我们的a变量的时候,通常会这样搜索:&lt;/p&gt;  &lt;p&gt;存在字符串1的数组行:&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;PS C:\Users\Terry&amp;gt; dir variable:|Out-String -Stream|Select-String "1"&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;$&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1    &lt;br /&gt;a b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123     &lt;br /&gt;arr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {1, 2, 3, 4}     &lt;br /&gt;b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1     &lt;br /&gt;c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1     &lt;br /&gt;PID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1396     &lt;br /&gt;PROFILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; E:\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1     &lt;br /&gt;PSHOME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Windows\System32\WindowsPowerShell\v1.0     &lt;br /&gt;ReportErrorShowSource&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1     &lt;br /&gt;text&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a*$b={123*0.19}&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;当我们要验证某个变量是否存在的时候,可以使用Test-Path&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; Test-Path variable:\a      &lt;br /&gt;&lt;/font&gt;True&lt;/p&gt;  &lt;p&gt;说明变量a是存在.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;删除变量:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; Remove-Variable -Name a      &lt;br /&gt;PS C:\Users\Terry&amp;gt; del variable:\b       &lt;br /&gt;PS C:\Users\Terry&amp;gt; $a       &lt;br /&gt;PS C:\Users\Terry&amp;gt; $b&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;使用Remove-Variable 或者是Del 来删除变量.&lt;/p&gt;  &lt;p&gt;关于变量操作的 Ps cmd 大家可以直接使用来搜:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; Get-Command -Noun Variable&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;CommandType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name    &lt;br /&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----     &lt;br /&gt;Cmdlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Clear-Variable     &lt;br /&gt;Cmdlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get-Variable     &lt;br /&gt;Cmdlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-Variable     &lt;br /&gt;Cmdlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Remove-Variable     &lt;br /&gt;Cmdlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set-Variable&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;在Powershell中还存在许多的windows环境变量,$env:*之类的&lt;/p&gt;  &lt;p&gt;大家可以看看dir env:来看看系统变量.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;最后 Powershell变量的作用域&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Powershell 会存在一个作用域,也就是变量在那个作用域下可用.我们需要了解的有4个作用域:&lt;/p&gt;  &lt;p&gt;global,private,local,script&lt;/p&gt;  &lt;p&gt;我们先看看官方是怎么表述的:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scope allocation&lt;/strong&gt;    &lt;br /&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;$private:test = 1&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;变量只能在当前作用域,脚本,函数可见,不能传递给其他的作用域,同理也只能在当前作用域下读写.&lt;/em&gt;    &lt;br /&gt;&lt;em&gt;$local:test = 1&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;变量在本地作用域下创建,这是创建变量的默认作用域,本地作用域变量能够在其他作用域下读取,但是不能通过其他作用域修改,只有本地作用域能够修改.&lt;/em&gt;    &lt;br /&gt;&lt;em&gt;$script:test = 1&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;脚本作用域变量只在脚本中有效,他可以在脚本的任何作用域下可见.比如在一个脚本的函数下创建了一个变量,那么在脚本的外部的函数也是可以访问的到的.    &lt;br /&gt;&lt;em&gt;$global:test = 1&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;变量任何作用域下可用,甚至是外部函数和脚本.&lt;/em&gt;    &lt;br /&gt;我们来做几个测试加强对这个概念的理解:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; notepad test.ps1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;我们先打开一个测试的脚本test.ps1在里面输入:&lt;/p&gt;  &lt;p&gt;$windows = $env:windir   &lt;br /&gt;"Windows Folder: $windows"&lt;/p&gt;  &lt;p&gt;保存关闭以后,执行&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; Set-ExecutionPolicy RemoteSigned&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;执行策略更改   &lt;br /&gt;执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies    &lt;br /&gt;帮助主题中所述的安全风险。是否要更改执行策略?    &lt;br /&gt;[Y] 是(Y)&amp;nbsp; [N] 否(N)&amp;nbsp; [S] 挂起(S)&amp;nbsp; [?] 帮助 (默认值为&amp;#8220;Y&amp;#8221;): y&lt;/p&gt;  &lt;p&gt;我们的Powershell默认是不允许执行没有签名的脚本,所以我们设置成RemoteSigned.允许本地未签名脚本.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $windows = "Hello"&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; &amp;amp; .\test.ps1     &lt;br /&gt;&lt;/font&gt;Windows Folder: C:\Windows    &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $windows     &lt;br /&gt;&lt;/font&gt;Hello&lt;/p&gt;  &lt;p&gt;(&lt;font style="background-color: #ffc000"&gt;小技巧,执行脚本的时候,要使用&amp;amp;或者. 路径的方式&lt;/font&gt;)&lt;/p&gt;  &lt;p&gt;我们首先在当前作用域下创建 windows 变量,然后调用脚本,脚本复制为 c:\windows,执行完脚本以后,windows变量还是Hello&lt;/p&gt;  &lt;p&gt;再来回顾一下我们当时的定义:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;变量在本地作用域下创建,这是创&lt;font color="#ff0000"&gt;建变量的默认作用域&lt;/font&gt;,本地作用域变量&lt;font color="#ff0000"&gt;能够在其他作用域下读取&lt;/font&gt;,但是&lt;font color="#ff0000"&gt;不能通过其他作用域修改&lt;/font&gt;,只有&lt;font color="#ff0000"&gt;本地作用域能够修改&lt;/font&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;我们修改test.ps1在顶部加上:$windows 增加一个打印,再次执行:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $windows = "Hello"&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; &amp;amp; .\test.ps1     &lt;br /&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;Hello&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Windows Folder: C:\Windows   &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $windows     &lt;br /&gt;&lt;/font&gt;Hello&lt;/p&gt;  &lt;p&gt;也证实了,官方的定义.只能读取不能修改.&lt;/p&gt;  &lt;p&gt;关于Global 没有太多想解释的..$global:test=1创建就好了(&lt;font style="background-color: #ffc000"&gt;这里强调一个,所有变量都 只对当前Session有效,也就是一个Powershell进程&lt;/font&gt;)&lt;/p&gt;  &lt;p&gt;那么我们来看看private变量&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $private:a=1     &lt;br /&gt;PS C:\Users\Terry&amp;gt; $a      &lt;br /&gt;&lt;/font&gt;1    &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; function test{$a}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; test&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;没有任何输出,说明private 是不能跨域的&lt;/p&gt;  &lt;p&gt;我们修改刚才的test.ps1更新内容为$a&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; $private:a = 1     &lt;br /&gt;PS C:\Users\Terry&amp;gt; notepad .\test.ps1      &lt;br /&gt;PS C:\Users\Terry&amp;gt; . .\test.ps1      &lt;br /&gt;&lt;/font&gt;1    &lt;br /&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; &amp;amp; .\test.ps1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;细心的读者可能发现了,使用&amp;amp;和.调用脚本是不同的.&lt;/p&gt;  &lt;p&gt;&amp;amp;的话,是会重新开打脚本的Scope,而.只作为本地Scope 当前Scope来执行脚本的.&lt;/p&gt;  &lt;p&gt;Script变量,大家可以自己测试啦,其实都很简单的.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;Powershell强类型变量&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Powershell是基于.NET 类型来使用的,.NET 我们知道是使用的强类型,意味着,我们在PS中可以使用同样强大的强类型变量&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; [DateTime]$d = "1"     &lt;br /&gt;&lt;/font&gt;&lt;font color="#c0504d"&gt;无法将值&amp;#8220;1&amp;#8221;转换为类型&amp;#8220;System.DateTime&amp;#8221;。错误:&amp;#8220;该字符串未被识别为有效的 DateTime。&amp;#8221;     &lt;br /&gt;所在位置 行:1 字符: 13      &lt;br /&gt;+ [DateTime]$d &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp; = "1"      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + CategoryInfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : MetadataError: (:) [], ArgumentTransformationMetadataException      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + FullyQualifiedErrorId : RuntimeException&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;PS C:\Users\Terry&amp;gt; [Int]$i = 1     &lt;br /&gt;PS C:\Users\Terry&amp;gt; $i="1"      &lt;br /&gt;PS C:\Users\Terry&amp;gt; $i ="a"      &lt;br /&gt;&lt;/font&gt;&lt;font color="#c0504d"&gt;无法将值&amp;#8220;a&amp;#8221;转换为类型&amp;#8220;System.Int32&amp;#8221;。错误:&amp;#8220;输入字符串的格式不正确。&amp;#8221;     &lt;br /&gt;所在位置 行:1 字符: 3      &lt;br /&gt;+ $i &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp; ="a"      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + CategoryInfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : MetadataError: (:) [], ArgumentTransformationMetadataException      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + FullyQualifiedErrorId : RuntimeException&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;使用强类型变量,可以做进一步执行前的类型确认.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;只读或只写其他功能的变量大家可以参考这个连接了,这些功能一般相对来说用的比较少.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;参考Link:&lt;a href="http://powershell.com/cs/blogs/ebook/archive/2008/10/22/chapter-3-variables.aspx"&gt;http://powershell.com/cs/blogs/ebook/archive/2008/10/22/chapter-3-variables.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1880999.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2010/11/18/1880999.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2010/11/12/1875707.html</id><title type="text">Powershell远程管理 二</title><summary type="text">上文Powershell 远程管理 （一）和大家大概的讲述了一个我的远程管理的过程，今天主要和大家说说ps 在交互式会话的管理方式也就是Pssession,Pssession是Windows Powershell会话的意思，一个会话，可以共享数据，提供交互式的对话，我们可以为某些命令例如Invoke-Command 制定会话来远程作业。当然我们还能利用Enter-Pssession来直接和远程计算机连接，直接建立一个持续安全的远程对话，来执行我们的所有命令。我们分三个部分来讲述Powershell Session，首先是域环境下的远程连接，WAN/LAN的远程连接（Trusthost方式），W</summary><published>2010-11-12T07:02:00Z</published><updated>2010-11-12T07:02:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/12/1875707.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/12/1875707.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上文&lt;a title="Powershell 远程管理 （一）" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/09/1872508.html"&gt;Powershell 远程管理 （一）&lt;/a&gt;和大家大概的讲述了一个我的远程管理的过程，今天主要和大家说说ps 在交互式会话的管理方式也就是Pssession,Pssession是Windows Powershell会话的意思，一个会话，可以共享数据，提供交互式的对话，我们可以为某些命令例如Invoke-Command 制定会话来远程作业。当然我们还能利用Enter-Pssession来直接和远程计算机连接，直接建立一个持续安全的远程对话，来执行我们的所有命令。&lt;br /&gt;&amp;nbsp;我们分三个部分来讲述Powershell Session，首先是域环境下的远程连接，WAN/LAN的远程连接（Trusthost方式），WAN/LAN的远程连接（SSL加密方式），可以先大致的理解为，当我们操作的机器和远程机器处于同一个AD下，那么是可以直接向Powershell使用Kerbors（基于FQDN），NTLM基于ip地址来进行身份标识的传输，一般是通过当前登录到机器的用户凭据。当我们处于另外的网络环境，或者工作机没有入域能够提供域标识的情况下，可以使用信任主机和SSL加密方式来向远程机器提供会话标识的方式。&lt;br /&gt;&amp;nbsp;Powershell基于WinRM和WinRS来建立远程会话的，以及和传统的WMI DCOM的对比。WMI 依赖 DCOM 在远程计算机上执行管理任务，而防火墙往往会阻止所有传入的 DCOM 通信，这使 WMI 很难（如果并非完全不可能）通过 Internet 以编程方式管理计算机&amp;nbsp;Windows 远程管理（WinRM）是&amp;#8220;WS 管理协议的 Microsoft 实施，该协议是基于标准 SOAP、不受防火墙影响的协议，允许不同供应商的硬件和操作系统相互操作。也就是我们在Client使用本地的WinRS（Windows Remote Shell） 向远程的WinRM（Windows Remote Service）基于SOAP 通过http或者https进行连接获取管理数据(底层依旧使用WMI，但是已经被包装了SOAP来通讯了)。必须注意的是：&lt;span style="color: red;"&gt;客户端和服务端都必须安装启用WinRM&lt;/span&gt;&lt;br /&gt;&lt;strong style="color: red;"&gt;Solution One：&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Client：非域环境 Domain：vm.terry-corp.com(也可以是工作组,我这里用的是域)&lt;br /&gt;&lt;strong&gt;客户端打开Powershell 执行 cd wsman::localhost\client 输入ls&lt;br /&gt;&lt;/strong&gt;PS Microsoft.WSMan.Management\WSMan::localhost\Client&amp;gt; ls&lt;br /&gt;(默认TrustedHosts 为空,当我们在非信任环境下(不能使用Kerbors认证) 的时候,必须使用TrustedHosts或者SSL方式)&lt;/p&gt;&lt;p&gt;##Set-Item TrustedHosts &amp;#8220;你的入域机器的IP或者工作组机器&amp;#8221;&lt;br /&gt;我这里执行的是:&lt;br /&gt;&lt;strong&gt;Set-Item TrustedHosts &amp;#8220;192.168.133.67&amp;#8221;&lt;br /&gt;&lt;/strong&gt;查看 ls&lt;/p&gt;&lt;p&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----&lt;br /&gt;NetworkDelayms&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5000&lt;br /&gt;URLPrefix&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wsman&lt;br /&gt;AllowUnencrypted&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; false&lt;br /&gt;Auth&lt;br /&gt;DefaultPorts&lt;br /&gt;TrustedHosts&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.133.67&lt;br /&gt;修改成功!&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;服务端&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;首先启用远程访问Enable-PSRemoting &amp;#8211;Force&lt;br /&gt;操作会打开WinRM服务,添加WinRM 的防火墙例外,可以在WF.MSC自己再次确认Windows Remote Management的防火墙是否对你的Client有了例外&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;客户端&lt;/span&gt;打开Powershell&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Enter-PSSession -ComputerName 192.168.133.67 &amp;#8211;Credential vm.terry-corp.com\Administrator&lt;/strong&gt;&lt;br /&gt;(可以设置自己的凭据,我这里用的域帐号)&lt;br /&gt;成功的话会显示:&lt;br /&gt;[192.168.133.67]: PS C:\Users\Administrator\Documents&amp;gt;&lt;br /&gt;记得退出Exit-Pssession&lt;br /&gt;&lt;span style="color: red;"&gt;Solution Two:&lt;/span&gt;&lt;br /&gt;WS-Management 加密通过网络传输的所有 Windows PowerShell 内容。UseSSL 是一种额外的保护措施，它通过 HTTPS 连接而不是 HTTP 连接来发送数据。&lt;br /&gt;因此使用SSL方式是一种更加安全可靠的远程管理方式.&lt;br /&gt;SSL的工作原理也是确认客户端和服务端的身份之后再进行握手的,还担保了数据的来源,不被纂改和监听.&lt;br /&gt;&lt;strong&gt;首先要生成SSL证书&lt;br /&gt;&lt;/strong&gt;(题外话:我本来打算使用AD 证书服务来给自己颁发一个机器名的证书,但是我入域机器的机器名是带上了dns后缀名的, 而我的客户端连接使用的是IP地址,那么会被认为证书的CN名和机器名不一致.AD 机器很多时候都是内网环境,所以想直接通过AD证书,那么你的DNS必须在客户端能够被解析.所以我这里使用的是自签名的证书)&lt;br /&gt;可以使用sslself.exe或者makecert.exe&lt;br /&gt;下载SelfSSL &lt;a href="http://www.microsoft.com/downloads/...laylang=en"&gt;http://www.microsoft.com/downloads/...laylang=en&lt;/a&gt;&lt;br /&gt;makecert.exe在.NET Framework 工具中有&lt;br /&gt;&lt;strong&gt;服务端生成证书&lt;br /&gt;&lt;/strong&gt;SELFSSL:&lt;br /&gt;C:\Program Files (x86)\IIS Resources\SelfSSL&amp;gt;&lt;strong&gt;selfssl.exe /N:CN=192.168.133.67 /V:3600 /T /Q&lt;br /&gt;&lt;/strong&gt;(ip就是服务端的ip)&lt;br /&gt;MAKECERT:&lt;br /&gt;&lt;strong&gt;MakeCert.exe -pe -n "CN=192.168.133.67" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange &amp;#8211;r C:\1.CER&lt;br /&gt;&lt;/strong&gt;(在C盘根目录下的1.cer)&lt;/p&gt;&lt;p&gt;打开inetmgr 移除默认站点对SSL 443的binding&lt;br /&gt;打开MMC (文件-&amp;gt;添加删除 管理单元)找到 证书 选择 本地计算机添加 找到根信任区域&lt;br /&gt;导出刚才的证书&lt;br /&gt;Copy 到&lt;span style="color: red;"&gt;客户端&lt;/span&gt;,导入证书到根信任区域&lt;br /&gt;再次返回到服务端&lt;br /&gt;打开MMC 找到刚才的证书,复制证书 详细信息里面的 指纹&lt;br /&gt;&lt;strong&gt;eb 10 24 5d 89 11 4a 57 4c 0c ba ac 79 b7 3b 3a 05 aa 1b d7&lt;br /&gt;&lt;/strong&gt;执行CMD&lt;br /&gt;C:\Users\Administrator&amp;gt; &lt;strong&gt;winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="192.168.133.67";CertificateThumbprint="&amp;#8206; eb 10 24 5d 89 11 4a 57 4c 0c ba ac 79 b7 3b 3a 05 aa 1b d7"}&lt;br /&gt;&lt;/strong&gt;添加对https 的监听,以及添加证书指纹.&lt;br /&gt;成功显示:&lt;br /&gt;ResourceCreated&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Address = &lt;a href="http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"&gt;http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReferenceParameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResourceURI = &lt;a href="http://schemas.microsoft.com/wbem/wsman/1/config/listener"&gt;http://schemas.microsoft.com/wbem/wsman/1/config/listener&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectorSet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Selector: Address = *, Transport = HTTPS&lt;br /&gt;执行&lt;strong&gt;Winrm enumerate winrm/config/listener&lt;/strong&gt; 也可以确认添加是否成功显示:&lt;/p&gt;&lt;p&gt;Listener&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Address = *&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transport = HTTPS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Port = 5986&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hostname = 192.168.133.67&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Enabled = true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; URLPrefix = wsman&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CertificateThumbprint = eb 10 24 5d 89 11 4a 57 4c 0c ba ac 79 b7 3b 3a 05 aa 1b d7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListeningOn = 127.0.0.1, 192.168.28.128, 192.168.133.67, ::1, fe80::5efe:192.168.28.128%13, fe80::5efe:192.168.133.6&lt;br /&gt;7%12, fe80::856d:7551:c80d:b615%11, fe80::c576:2df6:6d25:6da6%10&lt;br /&gt;说明已经正确添加了SSL证书.再次返回到&lt;span style="color: red;"&gt;客户端&lt;/span&gt;进行连接:&lt;br /&gt;Powershell&lt;br /&gt;&lt;strong&gt;Enter-PSSession -ComputerName 192.168.133.67 &amp;#8211;Credential vm.terry-corp.com\Administrator &amp;#8211;UseSSL&lt;br /&gt;&lt;/strong&gt;成功显示:&lt;br /&gt;[192.168.133.67]: PS C:\Users\Administrator\Documents&amp;gt;&lt;/p&gt;&lt;p&gt;至此Windows Powershell 的两种方式已经和大家说清楚了,大家不明白的地方可以直接cnblogs联系我.下一篇文章详细讲述如何使用URI 连接远程的WinRM服务进行管理,这主要涉及到IIS 和SSL的配置&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1875707.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2010/11/12/1875707.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2010/11/09/1872508.html</id><title type="text">Powershell 远程管理 （一）</title><summary type="text">Powershell 远程管理 （一）忙里偷闲挤出点时间写写PS在Windows不错的管理方式。Powershell 2.0以后可以说是有了质的变化，Modules的加入、ISE、WinRM远程管理的支持，今天主要讲一系列PowerShell在企业级应用的远程管理，其实也是我这次在部署一个应急方案使用的一些脚本和方案的集合吧。（我这里是 域环境，读者可以自己搭建测试）首先,我们需要安装Powershell 2.0和WinRM 2.0 ，这个是作为WindowsUpdate附加补丁得，可以通过可选补丁进行安装选中，直接安装就好了，如果要给所有的服务器安装这个补丁，那么可以考虑用AD环境下的WSU</summary><published>2010-11-09T05:04:00Z</published><updated>2010-11-09T05:04:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/09/1872508.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2010/11/09/1872508.html"/><content type="html">&lt;p&gt;Powershell 远程管理 （一）&lt;br /&gt;&amp;nbsp;忙里偷闲挤出点时间写写PS在Windows不错的管理方式。Powershell 2.0以后可以说是有了质的变化，Modules的加入、ISE、WinRM远程管理的支持，今天主要讲一系列PowerShell在企业级应用的远程管理，其实也是我这次在部署一个应急方案使用的一些脚本和方案的集合吧。（我这里是 域环境，读者可以自己搭建测试）&lt;br /&gt;&amp;nbsp;首先,我们需要安装&lt;span style="color: red;"&gt;Powershell 2.0和WinRM 2.0 &lt;/span&gt;，这个是作为WindowsUpdate附加补丁得，可以通过可选补丁进行安装&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/1_1.jpg" width="558" height="128" /&gt;选中，直接安装就好了，如果要给所有的服务器安装这个补丁，那么可以考虑用AD环境下的&lt;span style="color: red;"&gt;WSUS&lt;/span&gt;来安装这个补丁（关于WSUS的配置我会在以后讲述Win2k8 WSUS的文章下详细说明）。&lt;br /&gt;&amp;nbsp;Powershell好处之一就是文档很详细，我们不清楚要多使用Get-Help来查看帮助，可以先查阅一些关于远程的相关资料：Get-Help about_remote*，我在使用Powershell 1.0的使用做远程是相当的痛苦的，每次都要使用WMI的Win32_Process来创建远程进程，2.0提供了交互式的Session 以及比较好用的Invoke-Command ，同时对其他的命令提供了-ComputerName的参数，管理起来更加方便。&lt;br /&gt;&amp;nbsp;先说下使用WMI方式做远程调用吧，首先确认目标机器（需要管理的机器）的远程管理（Remote Administration）的防火墙是开启Inbound 允许您的IP传入的。&lt;br /&gt;&lt;span style="color: red;"&gt;打开Windows高级防火墙 &amp;#8211;&amp;gt; 传入规则（InboundRules） -&amp;gt;远程管理（Remote Administration）-&amp;gt;双击打开对话框 &lt;/span&gt;&lt;br /&gt;选中 Advanced 选择自己的作用域 我这里选择的All，以及在Scope下找到远程IP地址（Remote IP） 加入 Localsubset 本地子网 然后保存 启用规则 如图：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/1_2.jpg" width="396" height="396" /&gt;&amp;nbsp; &lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/1_3.jpg" width="382" height="188" /&gt;这样一下，我们就允许本地子网对 这台机器的 访问远程管理端口了（当然你可以根据自己，只给定一个IP访问目标机器的远程管理端口防火墙）。&lt;br /&gt;如果是域环境，要开启这个策略，我们可以建立一个GPO，在&lt;br /&gt;&lt;span style="color: red;"&gt;编辑GPO对象的策略-&amp;gt;计算机配置-&amp;gt;管理模版-&amp;gt;网络-&amp;gt;网络连接-&amp;gt;防火墙-&amp;gt;域-&amp;gt;Windows Firewall:Allow Inbound remote Administration exception的策略，&lt;/span&gt;&lt;br /&gt;启用并且选择自己需要加入的IP：&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/1_4.jpg" width="402" height="233" /&gt;然后应用到自己的OU 或者 整个站点（我建议您在部署入域的服务器先做好各种测试和策略，在入域以后 马上就会立即生效，那么也会比较方便，做远程管理呢。）&lt;br /&gt;先讲述三个命令：&lt;br /&gt;Get-WmiObject (1.0+)&lt;br /&gt;Invoke-WmiMethod (2.0)&lt;br /&gt;Invoke-Command (2.0)&lt;br /&gt;大家自行认真查看对应的帮助吧,Get-Help Get-WmiObject &amp;#8211;Full&lt;br /&gt;WMI调用的话，2.0直接使用Invoke-WmiMethod&lt;br /&gt;比如，我们经常用到的，更新租策略，我记得有一次，我失误导致大部分机器的3389端口全部关闭，远程链接全部失败。我更新组策略，但是没有GPO生效都要超过90分钟的，不得已 一些机器的admin$的共享也关闭，不能使用psexec 来远程调用命令。于是我就用WMI的方式来主动更新组策略：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('b4c42cee-8a3c-41dd-a148-d3761b0b7e5a')"&gt;&lt;img style="display: none;" id="code_img_opened_b4c42cee-8a3c-41dd-a148-d3761b0b7e5a" class="code_img_opened" onclick="cnblogs_code_hide('b4c42cee-8a3c-41dd-a148-d3761b0b7e5a',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_b4c42cee-8a3c-41dd-a148-d3761b0b7e5a" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GpupdateForce&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;param&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;(&lt;br /&gt;[String][parameter(Mandatory&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;[String]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$RemoteComputer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;)&lt;br /&gt;Invoke&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;WmiMethod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Class&amp;nbsp;Win32_Process&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Name&amp;nbsp;Create&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ArgumentList&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GPUPDATE&amp;nbsp;/FORCE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;EnableAllPrivileges&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ComputerName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$RemoteComputer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个方法我没有提供Credential ，就是默认当前登录的域帐号，我们也可以使用&lt;br /&gt;$creq = Get-Credential&lt;br /&gt;然后在Invoke-WmiMethod &amp;#8211;Credential $req的方式提供对应的凭据。例如：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('72e35839-c8fd-4fbe-84b2-8e9e68d50f1d')"&gt;&lt;img style="display: none;" id="code_img_opened_72e35839-c8fd-4fbe-84b2-8e9e68d50f1d" class="code_img_opened" onclick="cnblogs_code_hide('72e35839-c8fd-4fbe-84b2-8e9e68d50f1d',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_72e35839-c8fd-4fbe-84b2-8e9e68d50f1d" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;RemoteCall&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;param&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;(&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;#调用的命令&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;[String][parameter(Mandatory&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$Cmd&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;#远程计算机&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;[String][parameter(Mandatory&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$RemoteComputer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$credential&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Get&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Credential&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;#可以使用Invoke-Command&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Invoke&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;WmiMethod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Class&amp;nbsp;Win32_Process&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Name&amp;nbsp;Create&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ArgumentList&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$Cmd&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;EnableAllPrivileges&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ComputerName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$RemoteComputer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Credential&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$credential&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果你的帐号还不是管理员（这里比较麻烦了，使用WMI的 wmimgmt.msc来添加对应目标机器的权限，这里我不提供脚本了，因为相当的繁琐，以后有机会和大家说说解决方案吧。二就是dcomcnfg.exe设置您的用户允许远程RPC调用的权限）&lt;br /&gt;WMIMGMT.MSC:&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/1_5.jpg" width="413" height="288" /&gt;配置WMI命名空间权限。&lt;br /&gt;DCOMCNFG.EXE：&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/bhtfg538/1_6.jpg" width="558" height="378" /&gt;配置远程DCOM权限&lt;br /&gt;当然我们可以直接使用Invoke-Command和交互式Session来简化WMI的方式，我会在下一篇文章详细介绍&lt;/p&gt;&lt;p&gt;我就是用这种方式来主动更新的组策略，当时比较着急可能还有更多方案，我在这里抛砖引玉，毕竟咱不是Pro系统管理员，嘿嘿。&lt;br /&gt;&amp;nbsp;当时的情况。。。当时公司某些情况发生，导致服务器压力很大，需要立刻部署20台前端用来负载高负荷的请求，必须安装IIS，必须同步所有的程序代码，必须迅速建立站点。&lt;br /&gt;首先是代码同步，其实这种小工具是必须提前做好准备的，比如配置好rsync之类的。因为是突发事件我临时写了一个代码同步的工具，和大家介绍一下强大的robocopy。&lt;/p&gt;&lt;p&gt;代码同步：&lt;br /&gt;Win2008 是自带这个command 的，如果是2003 需要安装Resouces Tools 才能使用robocopy&lt;br /&gt;我使用了比较方便的Invoke-Command 。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4f3ed26d-fcfb-44df-853b-6b5ee5ea1be6')"&gt;&lt;img style="display: none;" id="code_img_opened_4f3ed26d-fcfb-44df-853b-6b5ee5ea1be6" class="code_img_opened" onclick="cnblogs_code_hide('4f3ed26d-fcfb-44df-853b-6b5ee5ea1be6',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_4f3ed26d-fcfb-44df-853b-6b5ee5ea1be6" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CodeSync&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;param&lt;/span&gt;&lt;span style="color: #000000;"&gt;([String][parameter(Mandatory&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$source&lt;/span&gt;&lt;span style="color: #000000;"&gt;,[String][parameter(Mandatory&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$target&lt;/span&gt;&lt;span style="color: #000000;"&gt;,[bool]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$mirror&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;$False&lt;/span&gt;&lt;span style="color: #000000;"&gt;,[int]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$retryNum&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,[int]&lt;/span&gt;&lt;span style="color: #800080;"&gt;$retrySec&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800080;"&gt;$mirror&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;Invoke&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Command&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ScriptBlock&amp;nbsp;{&amp;nbsp;robocopy.exe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$source&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$target&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;E&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ZB&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;COPYALL&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MIR&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;R:&lt;/span&gt;&lt;span style="color: #800080;"&gt;$retryNum&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;W:&lt;/span&gt;&lt;span style="color: #800080;"&gt;$retrySec&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;Invoke&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Command&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ScriptBlock&amp;nbsp;{&amp;nbsp;robocopy.exe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$source&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$target&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;E&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ZB&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;COPYALL&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;R:&lt;/span&gt;&lt;span style="color: #800080;"&gt;$retryNum&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;W:&lt;/span&gt;&lt;span style="color: #800080;"&gt;$retrySec&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$line&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;[int]&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;Get&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Content&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Path&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;E:\Desktop\Target.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;|%&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$arr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$_&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Split(',')&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800080;"&gt;$arr&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Length&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080;"&gt;-ne&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;Write&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Host&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Line&amp;nbsp;`"$_`"&amp;nbsp;parameter&amp;nbsp;error&amp;nbsp;at&amp;nbsp;line&amp;nbsp;$line`nParameter&amp;nbsp;Format:Source&amp;nbsp;Target&amp;nbsp;Mirror&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ForegroundColor&amp;nbsp;Red&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;CodeSync&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$arr&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$arr&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080;"&gt;$arr&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008080;"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;Write&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Host&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Task&amp;nbsp;$line&amp;nbsp;Sync&amp;nbsp;Complete!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;ForegroundColor&amp;nbsp;Green&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;$line&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;}&lt;br /&gt;Read&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;Host&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Press&amp;nbsp;any&amp;nbsp;key&amp;nbsp;exit...&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个简单的脚本提供了从某个配置文件读取共享目录来同步&lt;br /&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/admin/file://machine1//C$/Test/1,//MACHINE2/c$/Test/2,0"&gt;file://machine1//C$/Test/1,//MACHINE2/c$/Test/2,0&lt;/a&gt;&lt;br /&gt;参数1标识Source&lt;br /&gt;参数2标识 Destination&lt;br /&gt;参数3标识 是否完全覆盖&lt;/p&gt;&lt;p&gt;就这样，我先把代码同步到了不同的20个前端。&lt;br /&gt;&lt;span&gt;安装IIS：&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ServerManagerCMD.exe&lt;/span&gt;&lt;br /&gt;&lt;span&gt;前面我们提供了RemoteCall的脚本，联想到直接使用RemoteCall &amp;#8220;ServerManagerCMD.exe &amp;#8211;install 角色&amp;#8221;,机器名，因此我很顺利的安装了IIS。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;部署IIS：&lt;/span&gt;&lt;br /&gt;&lt;span&gt;这里我走了一些弯路，我试图用 root/WebAdministration 来搞定这一切，但我发现关于IIS WMI的文档太少了，以至于我基本上没找到合适的调用方法。后来我尝试使用了appcmd，也大获成功了：&lt;/span&gt;&lt;br /&gt;&lt;span&gt;思路大致使用RemoteCall 调用 本地的appcmd 来 部署IIS&lt;/span&gt;&lt;br /&gt;&lt;span&gt;首先我调用&lt;/span&gt;&lt;br /&gt;&lt;span&gt;"C:\Windows\System32\inetsrv\appcmd.exe add site /name:`"test`" /bindings:http://*:80 /physicalpath:`"C:\test\ `""&lt;/span&gt;&lt;br /&gt;&lt;span&gt;添加了站点&amp;nbsp; test，而且绑定了 所有IP地址的80端口，路径是：C:\test\&lt;/span&gt;&lt;br /&gt;&lt;span&gt;注意：在Powershell中的字符串出现了双引号，要使用 &amp;#8220;`&amp;#8221;（1左边的键）来转义。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;然后&lt;/span&gt;&lt;br /&gt;&lt;span&gt;"C:\Windows\System32\inetsrv\appcmd.exe start site `"f-sq`""&lt;/span&gt;&lt;br /&gt;&lt;span&gt;我打开了站点，默认是关闭的。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;"C:\Windows\System32\inetsrv\appcmd.exe delete site `"Default Web Site`""&lt;/span&gt;&lt;br /&gt;&lt;span&gt;我删除了所有机器的默认站点&lt;/span&gt;&lt;br /&gt;&lt;span&gt;"C:\Windows\System32\inetsrv\appcmd.exe set config&amp;nbsp; /section:httplogging /dontlog:True"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;并且禁用了 本地的IIS 日志&lt;/span&gt;&lt;br /&gt;&lt;span&gt;"C:\Windows\System32\inetsrv\appcmd.exe add apppool /name:`"test`" /queueLength:50000 /processModel.userName:`"test\test`" /processModel.password:`"%^&amp;amp;*(234`" /processModel.loadUserProfile:`"True`" /processModel.maxProcesses:5 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;/failure.loadBalancerCapabilities:`"TcpLevel`" /failure.rapidFailProtectionMaxCrashes:50 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;/processModel.identityType:`"SpecificUser`""&lt;/span&gt;&lt;br /&gt;&lt;span&gt;创建了新的应用程序池 制定了工作线程，队列长度，自定义域帐号等。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;"C:\Windows\System32\inetsrv\appcmd.exe set site /site.name:`"f-sq`" /applicationDefaults.applicationPool:`"test`""&lt;/span&gt;&lt;br /&gt;&lt;span&gt;最后将站点绑定到test 应用程序池&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;#8226;整个过程只话了一个多小时，试想如果以后再来100台前端机器，那么可能只要1分钟时间就能搞定这个任务了。所以说积累也很重要！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;本文已实际的经历描述，希望能帮助到大家，在一篇文章中我会说到PSSession 的实战经验。&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bhtfg538/aggbug/1872508.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bhtfg538/archive/2010/11/09/1872508.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2010/05/12/1733853.html</id><title type="text">SQL Server 2008 复制 分区SWITCH清理数据 Solution</title><summary type="text">SQL Server 2008 复制 分区SWITCH清理数据场景：某种特定业务下，我们的部分业务数据可能只会保留比较短的时间，用来做临时处理。因为考虑高可用的特性，可能会利用SQL Server的复制组件复制这种数据到另外的 类似前端，查询中心等数据库服务器，创建一个冗余副本。复制组件标记事务日志，追踪所有的Update，Insert，Delete操作。可是如果不定期清理这种表，那么在一个快速增长的环境下，表变的臃肿不堪，不仅仅浪费磁盘空间，而且给性能带来了负面影响。如：A临时数据中心 ---同步--&gt;B 查询/其他业务中心，副本 保证A不可用的时候，B的业务不依赖于A服务器，利用A同步过来</summary><published>2010-05-12T09:15:00Z</published><updated>2010-05-12T09:15:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2010/05/12/1733853.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2010/05/12/1733853.html"/><content type="text">SQL Server 2008 复制 分区SWITCH清理数据场景：某种特定业务下，我们的部分业务数据可能只会保留比较短的时间，用来做临时处理。因为考虑高可用的特性，可能会利用SQL Server的复制组件复制这种数据到另外的 类似前端，查询中心等数据库服务器，创建一个冗余副本。复制组件标记事务日志，追踪所有的Update，Insert，Delete操作。可是如果不定期清理这种表，那么在一个快速增长的环境下，表变的臃肿不堪，不仅仅浪费磁盘空间，而且给性能带来了负面影响。如：A临时数据中心 ---同步--&gt;B 查询/其他业务中心，副本 保证A不可用的时候，B的业务不依赖于A服务器，利用A同步过来</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2010/05/11/1732740.html</id><title type="text">SQL Server 2008 安全性——透明数据加密(TDE)</title><summary type="text">SQL Server 2008 安全性——透明数据加密(TDE) 在SQL Server 2005的安全性来说，做的不够好，比如EKM这种可扩展的外部密钥管理就不支持，包括对数据库文件本身的加密。 SQLServer 2008中增加了透明数据加密TDE，TDE使用DEK 数据库加密密钥对数据文件进行加密，包括IO操作，加入内存等都是存在加密和解密操作的。DEK本身是受master数据库下的证书保护的，当然也支持EKM模块包含。我们对数据文件可以使用标准的DES和AES加密。 在某些特定场合，比如我们的服务器发生盗窃行为的时候，一些关键性数据库不被恶意附加挖掘其中的价值数据，除了使用硬件级别的文</summary><published>2010-05-11T08:40:00Z</published><updated>2010-05-11T08:40:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2010/05/11/1732740.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2010/05/11/1732740.html"/><content type="text">SQL Server 2008 安全性——透明数据加密(TDE) 在SQL Server 2005的安全性来说，做的不够好，比如EKM这种可扩展的外部密钥管理就不支持，包括对数据库文件本身的加密。 SQLServer 2008中增加了透明数据加密TDE，TDE使用DEK 数据库加密密钥对数据文件进行加密，包括IO操作，加入内存等都是存在加密和解密操作的。DEK本身是受master数据库下的证书保护的，当然也支持EKM模块包含。我们对数据文件可以使用标准的DES和AES加密。 在某些特定场合，比如我们的服务器发生盗窃行为的时候，一些关键性数据库不被恶意附加挖掘其中的价值数据，除了使用硬件级别的文</content></entry><entry><id>http://www.cnblogs.com/bhtfg538/archive/2009/11/07/1597748.html</id><title type="text">数据库 表/索引 分区</title><summary type="text">[代码]</summary><published>2009-11-06T16:31:00Z</published><updated>2009-11-06T16:31:00Z</updated><author><name>Sai~</name><uri>http://www.cnblogs.com/bhtfg538/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bhtfg538/archive/2009/11/07/1597748.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bhtfg538/archive/2009/11/07/1597748.html"/><content type="text">[代码]</content></entry></feed>
