使用脚本程序管理Windows网络 第十部分:远程脚本技巧

日期: 2008-10-09 作者:Mitch Tulloch翻译:曾少宁 来源:TechTarget中国 英文

你知道可以使用VBScritp编写的WMI脚本吗?它可以帮助你远程管理你的Windows网络。这篇文章详细介绍了两个关于如何使用脚本管理Windows网络的技巧,原文发表在WindowsNetworking.com。 在前面的几篇文章中我们已经学习了关于Windows平台上远程脚本的概念和其他相关知识。在这篇文章中,我们将讨论与使用VBScript编写WMI脚本的远程脚本化相关的两个技巧。

首先,介绍一个来自《Windows Vista工具集》的技巧。这本书是专门针对在大中型企业网络环境中部署Windows Vista的IT人员使用的。我有幸作为主要作者参与这本书的撰写,并且得到Microso……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

你知道可以使用VBScritp编写的WMI脚本吗?它可以帮助你远程管理你的Windows网络。这篇文章详细介绍了两个关于如何使用脚本管理Windows网络的技巧,原文发表在WindowsNetworking.com。

在前面的几篇文章中我们已经学习了关于Windows平台上远程脚本的概念和其他相关知识。在这篇文章中,我们将讨论与使用VBScript编写WMI脚本的远程脚本化相关的两个技巧。

首先,介绍一个来自《Windows Vista工具集》的技巧。这本书是专门针对在大中型企业网络环境中部署Windows Vista的IT人员使用的。我有幸作为主要作者参与这本书的撰写,并且得到Microsoft出版社授权,可以与大家一起分享这本非常棒的书中的一些节选。

技巧一:将Cscript.exe作为默认脚本部署在远程计算机上

第一个技巧,简单却很实用,但我们必须先介绍一些必需的背景知识。我相信大家知道目前有几种方法可以在Windows计算机调用脚本的。例如,如果在一台计算机上有一个脚本ChangeIPAddress.vbs,我们可以这样执行它:

 双击该.vbs文件或它的快捷方式。

 点击“开始”-“运行”,输入“ChangeIPAddress.vbs”后点击“OK”。

 打开命令提示符,转到脚本目录,输入ChangeIPAddress.vbs,回车。

完成这些步骤后出现的结果取决于计算机上的Windows Script Host (WSH)的默认设置。WSH是一个基于脚本引擎的与语言无关的脚本宿主。例如,WSH会使用VBScript脚本引擎运行VBScript脚本,所以WSH是作为脚本运行的“环境”存在的。但WSH实际上有两个默认的脚本宿主:

 Wscript.exe ,它提供了一个基于Windows的对话框用于设置脚本属性,并以窗口形式显示脚本输出。

 Cscript.exe ,它是在命令提示符上配置脚本属性和显示脚本输出。

让我们先看看两者之间的区别。我将使用第二章中的ChangeIPAddress.vbs脚本来演示这个问题。让我们在一个Windows Vista主机上打开命令提示符并使用这个脚本将主机的IP地址修改为172.16.11.173。这里需要注意的第一件事是修改网络配置需要本地主机的管理员权限,所以我需要右击 “附件”中的“命令提示符”快捷方式,选择“以管理员身份运行”。这时会弹出一个“用户帐号控制(UAC)”对话框,我会点击“继续”(如果我当前用户帐号是主机的本地管理员组的成员)或输入一个本地管理员帐号的认证信息(如果我的用户帐号仅仅是本地用户组的成员)。

无论是哪种方法,我都会打开一个管理员运行级别的命令提示符窗口,然后我输入下面的命令去修改主机的地址(图1):

 尝试使用脚本去修改IP地址

图1:尝试使用脚本去修改IP地址

当我按“回车”后,经了几秒钟后会有一个对话框弹出(图2):

 脚本的输出显示在一个对话框中

图2:脚本的输出显示在一个对话框中

这个消息是从什么地方来的?这是因为在我们的ChangeIPAddress.vbs脚本的最后包含有以下几行代码:

'Display result or error code
If errEnableStatic=0 Then
     Wscript.Echo "Adapter's IP address has been successfully changed to " & strAddress
Else
     Wscript.Echo "Changing the adapter's address was not successful. Error code " & errEnableStatic
End If

所以结果是Wscript.Echo语句显示一个窗口化的输出(如,弹出一个对话框),而不是在命令提示符窗口中显示输出。这其中的原因是,Wscript.exe是主机默认的脚本宿主,而这就是它的默认处理方法,如:使用像这样的弹出窗口显示所有的脚本输出。

我们怎么能够改变它的这种默认行为而将脚本输出显示在命令提示符中呢?一种方法是显示式地调用命令行脚本宿主Cscript.exe来运行脚本。你可以这样做(图3):

 使用cscript.exe使脚本输出显示在命令提示符窗口中

图3:使用cscript.exe使脚本输出显示在命令提示符窗口中

但像这样每一次都必须在脚本名称前加入Cscript是很麻烦的,所以我们可以将先Cscript.exe设为所有WSH调用的默认脚本宿主,作法是这样:

 将cscript.exe设为默认的脚本宿主

图4:将cscript.exe设为默认的脚本宿主

现在我们可以直接运行脚本并在命令提示符窗口中显示它的结果,而不需要在前面加Cscript了(图5):

 脚本的输出直接显示在命令提示符窗口

图5:在Cscript.exe调为默认的脚本宿主后,脚本的输出直接显示在命令提示符窗口

现在你可能已经完全明白了,但是这里还有一个问题。我们有一批像ChangeIPAddress.vbs这样的脚本是要通过部署在目标主机上远程地运行的,它们是作为使用“分组策略”的登录脚本或启动脚本的。而这其中有一些脚本使用了Wscript.Echo语句去生成脚本输出。如果其中一个这样的脚本部署到远程主机上并在主机上运行,将会怎么样呢?脚本运行后,会有一系列的窗口出现在用户桌面,然后用户将不得不一个个地去点击OK关闭它们,然后才能让脚本继续执行下去。这太麻烦了!有什么办法可以解决这个问题呢?

是的,你可以有两个方法可以选择。第一,你可以编辑脚本,删除或注释掉所有的Wscript.Echo语句,这样脚本就不会产生任何输出。这也是很麻烦的,特别是如果你有大量这样的脚本。

那么第二种方法是什么呢?以下是摘自《Windows Vista工具集》的方法:

在一个使用“分组策略”管理桌面计算机的Active Directory环境中,你可以通过以下的步骤将OU中的所有计算机上的默认脚本宿主从Wscript.exe修改成Cscript.exe:

1.用记事本新建一个文本“ChangeToCscript.bat”,并在其中添加两行代码:

@echo off
cscript //h:cscript //s

2.打开链接到OU的GPO,转到Computer ConfigurationWindows SettingsScriptsStartup。

3.双击“Startup”策略设置,打开它的属性窗口。

4.点击“Show Files”按钮,将ChangeToCscript.bat从Windows资源浏览器拷贝/粘贴到子目录SYSVOL 中,这是启动脚本所在的目录。

5.在“Startup”策略设置的属性窗口中点击“Add”按钮。

6.点击“Browse”按钮并选择ChangeToCscript.bat。

7.关闭所有的属性窗口。

8.添加这个启动脚本到目标主机,会使得在这些计算机重新启动后,它们的默认脚本宿主从Wscript.exe变为Cscript.exe,而且不管对于标准用户还是本地计算机管理员的目标用户是都会生效。

注意:ChangeToCscript.bat必须作为“Startup”脚本运行,而不是“Logon”脚本。如果你把它作为Logon运行,这只会在目标用户是本地计算机管理员时才会有效。你现在已经感觉到使用两行的批处理文件就能解决问题很不错吧?现在你可以部署任何脚本到你的目标计算机,而不用担心用户会在他们的屏幕上碰到大量的窗口了。

技巧二:不需要指定管理员身份直接运行脚本

第二个技巧是一个读者读完我之前的一篇文章后提交给我的。我认为这是一个非常棒的方法,所以我问他是否可以共享给WindowsNetworking.com的其他读者,他同意了。所以我将直接引用他邮件,向大家介绍他提供的技巧:

我不输入身份认证信息而直接执行“运行”的方法是使用本地管理员帐号访问WMI,然后将本地管理员密码存储在一个在网络中共享的文本文件中,它是在受NTFS权限保护的。例如,如果“tech1 ”和“tech4 ”和“ tech5 ”是正常的域帐户(而不是域管理员) ,但这些用户已经被授权运行WMI脚本,那么我将给这些账户NTFS权限来获得包含本地管理员密码的文本文件,这样我就可以这样导入密码并连接:

Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2", strComputer & "Administrator", strImportedPassword)
Well, the above is not 100% true. I actually use:
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.Privileges.AddAsString("SeSecurityPrivilege")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, "rootcimv2", strComputer & "administrator", strPWD, "", "", &H80)
Set objReg = objSWbemLocator.ConnectServer(strComputer, "rootdefault", strComputer & "administrator", strPWD, "", "", &H80)
Set oReg = objReg.Get("StdRegProv")

……这样达成了同样的目标。

连接到本地管理员帐户的方法有另一个有趣的副作用;它不会在PC的“Documents and Settings”目录你的域帐号的帐号信息复本。当使用我的网域帐户时,有几个用户问道:“为什么你连接到我的电脑上?”并且很是怀疑我在窥探什么。通过使用本地管理员帐户,他们不知道有其他人连接(他们是无法看到安全日志)。

关于记录问题,实际中我们有几个不同的本地管理员密码可使用;因此脚本导入用户列表,并试图逐一尝试直到成功或试完所有选择。

作者

Mitch Tulloch
Mitch Tulloch

Mitch Tulloch是一个作家、培训师和Windows服务器操作系统、IIS管理、网络故障修复和安全方面的专业顾问。他已经写了15本书,其中包括:Microsoft Encyclopedia of Networking (Microsoft Press),Microsoft Encyclopedia of Security (Microsoft Press),Windows Server Hacks (O'Reilly),Windows Server 2003 in a Nutshell (O'Reilly),Windows 2000 Administration in a Nutshell (O'Reilly),and IIS 6 Administration (Osborne/McGraw-Hill)。Mitch居住在加拿大的Winnipeg,你可以他的网站www.mtit.com查到更多关于他的书的信息。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐