从WindowsNetworking.com学习如何自动化日常管理任务并根据这个来自于的技巧管理你的网络。 一个流行的关于教授人知识的谚语: “授人以鱼,不如授人以渔。” 的确如此。而在忙碌的IT世界里,这也适用于脚本化管理: “给人一个有用的脚本,不如教他自己写脚本。
” 如何能够使用脚本去自动化日常管理任务,可以简化管理员的日常工作。但为什么学习写脚本呢?不是已经有很多网站,如Microsoft’s Script Center Script Repository,可以下载大量的满足需求的脚本吗?没错,有一定道理。这些脚本的确是很好用,但通常你需要对它们进行定制以满足自己的……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
从WindowsNetworking.com学习如何自动化日常管理任务并根据这个来自于的技巧管理你的网络。
一个流行的关于教授人知识的谚语:
“授人以鱼,不如授人以渔。”
的确如此。而在忙碌的IT世界里,这也适用于脚本化管理:
“给人一个有用的脚本,不如教他自己写脚本。”
如何能够使用脚本去自动化日常管理任务,可以简化管理员的日常工作。但为什么学习写脚本呢?不是已经有很多网站,如Microsoft’s Script Center Script Repository,可以下载大量的满足需求的脚本吗?没错,有一定道理。这些脚本的确是很好用,但通常你需要对它们进行定制以满足自己的要求或自己环境的特殊要求。又有时你希望自己可以对脚本进行某些修改,以完成与脚本作者解决问题的方法不一样的功能,比如将几个脚本整合成一个大的脚本或者将一个脚本的输出作为另一个脚本的输入。或者你想修改其中的一个脚本,这样你就可以用来处理用户的实时输入。或者你想将一个脚本修改后作为启动脚本或登录脚本使用。又或者你想通过修改一个脚本,使它对一个远程计算机上产生作用等等。
如果你想完成上面提到的任何一个修改,你必须学会了Windows脚本编写的基础知识。如果你开始进行学习的话,你会惊奇地发现这并不是一件很难的事,而这正是这篇文章所要阐述的问题。你将从Windows脚本编写基础开始,逐渐深化理解如何为Windows网络编写不同方面的脚本。最后,你将能够为你所需要自动化的任务编写脚本,从而简化你的管理工作。而且你将不仅能够从零开始编写脚本,也能够定制你从各种来源下载的公用的脚本。我也将同时告诉你各种可以帮助你学习Windows脚本编写的资源,并向你介绍一些非常有用的脚本编写工具。
编写TCP/IP设置脚本
大多数管理员都使用VBScript来编写Windows管理脚本。VBScript不仅仅是一个强大的编程语言,它的语法非常容易学习。VBScript也能与Windows Management Instrumentation (WMI)和Active Directory Services Interfaces (ADSI)一起使用,编写关于Windows系统或基于Active Directory的网络的任何方面的脚本。我们将从使用VBScript和WMI去完成一些有用的工作开始学习Windows脚本编写:修改一个网络适配器的IP地址。
为什么会需要修改网络适器IP地址呢?是这样的,我使用许多的Virtual Server和Virtual PC来配置测试环境,然后我常常发现我必须将一个运行Windows Server 2003的虚拟机(VM)从一个虚拟网络移到另一个网络,以便可以进行其他的测试。这就意味着我需要修改服务器的IP地址(可能也要修改默认网关)。我知道我们可以从“控制面板”上打开“网络连接”,右击“本地连接”,然后选择“属性”,在“常规”标签中选择“Internet Protocol (TCP/IP)”,输入IP地址并点击2次“OK”。这么多的动作很费时间——不是吗?哦,没错,我还可以打开命令提示符然后使用Netsh命令完成配置,但Netsh有太多不同的上下文、命令和参数以致我需要一次又次地看Netsh的帮助文档才能顺利完成配置。
但我们这里真正要学的如何编写脚本完成配置,所以让看怎么用VBScript和WMI修改一个机器的IP地址。这包括学习一些特定的概念和方法包括:对象、方法、属性、命名空间等。
首先,我们在本地计算机运行脚本:
strComputer = "." |
这里str-前缀表示strComputer是一个字符串型的变量,而句号是一个指向本地计算机的通配符,作为WMI命名空间的开始位置。什么是一个WMI命名空间?它是一个分层次的不同类型的用于管理Windows计算机不同方面的对象集合。比如,其中有一个根命名空间,根下面是一些这样的命名空间,包括SECURITY,perfmon,CIMV2等等。大多有用的WMI类可以在rootcimv2命名空间下找到,在我们操作这些类之前我们需要将其实例化成对象。然后我们可以查看这些对象的属性和通过调用它们的方法来操作它们。
简单的概念介绍
类、对象、属性、方法——这都是什么?这里有个类比的例子可以帮助理解:MicrowaveOven(微波炉)类。换句话说,MicrowaveOven类是所有可能的微波炉(不局限于任意一个微波炉)的抽象集合。这个类可能有以下的属性:Color(颜色)、CubicInches(立方尺寸)、HasTurntable(是否有转盘)等等。属性是一个类的特性。换句话说,微波炉有固定的颜色、一个用立方英寸表示的内部尺寸,他们可以有一个转盘或者没有,等等。
MicrowaveOven类也有方法。方法是类可以作的动作或你可以对类做的动作。对于这个特定的类,可能有这样一些方法:SetCookingTime、SetPowerLevel、Reset等。通常情况下调用一个方法时你需要传入一个参数给方法。比如,调用SetCookingTime方法时我们可能需要定义一个用秒表示的CookingTime变量,然后将这个参数传递给这个类的特定的一个实例的SetCookingTime方法(一个实际的、现实存在的微波炉——不是抽象类)。在WMI VBScript是你可以这样做:
intCookingTime = 120 errSetCookingTime = objMicrowave.SetCookingTime(intCookingTime) |
但是Microwave的对象(objMicrowave)又是从哪里来的呢?我们还没创建它,所以我们用Set命令和createObject方法创建它:
Set objMicrowave = createObject("MicrowaveOven") |
实际上,有些吹毛求疵地但更准确地说,objMicrowave不是MicrowaveOven的一个对象,而是一个MicrowaveOven类的一个对象的引用。但为了简单起见,我们现在就把它当作MicrowaveOven类的一个对象看待。
我们需要添加一个strColor变量,这样我们可以设置我们的微波炉的颜色为Green(绿色),我的脚本程序变成这样(包括了一些说明性注释):
strColor = "Green" ’specifies color intCookingTime = 120 ’specifies cooking time in seconds Set objMicrowave = createObject("MicrowaveOven") ’creates the instance of the object errSetCookingTime = objMicrowave.SetCookingTime(intCookingTime) ’calls a method to set the cooking time and saves resulting error code objMicrowave.Color = strColor ’sets the value of the Color property |
这越来越有意思了,不是吗?
回到脚本
这是我们使用WMI去访问机器的TCP/IP配置所需要去做的:
Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2") |
通过定义一个objWMIService对象并将GetObject方法的返回值赋给这个变量,这样就可以连接到本地计算机的rootcimv2命名空间了。一旦连接上了这个命名空间,我们就可以用下面的语句从中收集需要的信息:
Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")") |
这些语句到底做了什么?首先,你可以看到一个我们在之前的语句中就已经实例化好的objWMIService对象。这个对象之后是execQuery,它可能是一个属性或方法(只有object.property或object.method这2个格式),这里我们可以根据字面意思猜测它是一个方法,即“执行一个查询”。execQuery是通过传递一个参数而被调用的,这个参数是一个SQL语句(select),这个语句返回一个包含机器上的所有(*号)绑定和激活了TCP/IP的网络配置器配置集合。然后这个方法返回的集合被赋给变量colNetAdapters,它表示了机器上的所有网络配置器的集合。
我们可以对这个集合做什么呢?对于这样一个集合,我们必须使用For Each…Next来循环遍历它:
For Each objNetAdapter in colNetAdapters ’ do something to each network adapter’s configuration Next |
我们必须得用这种方式来循环遍历它,即使集合里只有一个对象。
既然我们是想要做是修改网络适配器的IP地址,就让我们先定义一些变量吧:
arrIPAddress = Array("172.16.11.99") arrSubnetMask = Array("255.255.255.0") |
需要注意的是定义新IP和子网掩码的变量必须是数组变量。我们是怎么确定这一点的?这是因为,首先Windows计算机可能有超过1个的IP地址、默认网关等。所以为何不用数组变量来表示所有的IP设置以保持一致性呢?其次,如果我们在MSDN的WMI参考手册上查看一下Win32_NetworkAdapterConfiguration类,我们会发现它实际上是出也这样使用的。我们将在后面的文章中对它作仔细探究,这里暂不作更详细的介绍。
最后,Win32_NetworkAdapterConfiguration类的EnableStatic方法去将我们机器上的网络适配器的IP地址和默认网关修改成我们在数组变量定义的新值。我们是这样做的:
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) |
这里的err-变量是作为存储方法执行后返回的错误码使用的。
将所有脚本整合在一起
让我们将所有的脚本整合在一些看看:
strComputer = "." arrIPAddress = Array("172.16.11.99") arrSubnetMask = Array("255.255.255.0") Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2") Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration") For Each objNetAdapter in colNetAdapters errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) Next |
就是这些了——还没有变量定义、错误处理、使用输入和验证输出。我们将在下一篇文章中介绍如何添加这部分脚本,但先让我看看它是否正常工作。我们先保存脚本(要保证记事本的自动换行是关闭的)为“ChangeIPAddress.vbs”,然后将其拷贝到静态IP为172.16.11.45的服务器的桌面上。然后,以管理员身份登录,打开命令提示符,转变目录到桌面,然后使用命令行宿主Cscript.exe执行脚本。结果是这样的:
C:Documents and SettingsAdministratorDesktop>ipconfig Windows IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 172.16.11.45 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.11.1 C:Documents and SettingsAdministrator.DC-1Desktop>cscript ChangeIPAddress.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. C:Documents and SettingsAdministratorDesktop>ipconfig Windows IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 172.16.11.99 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.11.1 |
没错,它能正常工作。我们在执行第二个ipconfig命令可以看到,机器的IP地址已经成功地从.45修改为.49。
关于作者:
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查到更多关于他的书的信息。
作者
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的能源管理》等。
相关推荐
-
梭子鱼Web应用防火墙助力网站数据采集管理 有效预防攻击
网站数据持续地被脚本、bots病毒和其它一些自动执行的程序采集,这有时候是件好事,有时候却并非如此,通常介于两者之间。
-
使用脚本管理Windows网络(更新版)
“授人以鱼,不如授人以渔。”的确如此。而在忙碌的IT世界里,这也适用于脚本化管理:“给人一个有用的脚本,不如教他自己写脚本。”
-
使用脚本管理Windows 网络 第十三部分:返回所有值的脚本
在本系列的前一篇文章WindowsManagement Instrumentation属性中,我们编写了一个名为DisplayClassProperties.vbs的脚本,该脚本显示了WMI类中所有的属性名称。
-
使用脚本管理Windows 网络 第十一部分:更多的远程脚本技巧
本章将学习远程脚本技巧和本地管理员如何使用Windows Management Instrumentation Command-line (WMIC)进行远程查询。