使用脚本管理Windows 网络 第十一部分:更多的远程脚本技巧

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

本章将学习远程脚本技巧和本地管理员如何使用Windows Management Instrumentation Command-line (WMIC)进行远程查询。 在前一篇文章中,我们研究了两个远程脚本技巧,一个来自于一位热心读者,另一个来自最近发布的Windows Vista Resource Kit的内容。在这篇文章中,我们将学习另外两个脚本技巧。第一个是来自于我们的另一位读者的。

而第二个是,用一个实际例子来展现如何使用Windows Management Instrumentation Command-line (WMIC)。 技巧1:另外一个“runas”技巧——使用加密 第一个脚本……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

本章将学习远程脚本技巧和本地管理员如何使用Windows Management Instrumentation Command-line (WMIC)进行远程查询。

在前一篇文章中,我们研究了两个远程脚本技巧,一个来自于一位热心读者,另一个来自最近发布的Windows Vista Resource Kit的内容。在这篇文章中,我们将学习另外两个脚本技巧。第一个是来自于我们的另一位读者的。而第二个是,用一个实际例子来展现如何使用Windows Management Instrumentation Command-line (WMIC)。

技巧1:另外一个“runas”技巧——使用加密

第一个脚本技巧是由一位来自英国的读者Steven Beard所提出的。Steven 提供了另一种如何在脚本内调用“runas”命令的方法,以及它是如何用于企业环境中的。让我们来看看Steven是怎么说的:

你好,我是你所有文章的热心读者,并且我对你关于VB脚本部分的内容非常感兴趣。我使用VB脚本来管理我的Windows域已经有许多年了,但至今还不能对WMI完全理解,我只对我所涉及的内容有所了解的。

你上一篇章中关于runas功能真的很不错,我也用这种方法,但是我的方法与你的不太一样:

Set WshShell = CreateObject("Wscript.Shell")
Set WshEnv = WshShell.Environment("PRocess")
WshShell.Run "runas.exe /user:" & "domainuser" & " " & Chr(34) & "cscript c:PCQuery.vbs" & Chr(34)
Wscript.Sleep 800
WshShell.AppActivate WshEnv("SystemRoot") & "system32runas.exe"
Wscript.Sleep 200
WshShell.SendKeys "PASSWORD" & "~"
Wscript.Sleep 500
Set WshShell = Nothing
Set WshEn = Nothing
 

基本上,我上面的脚本封装了我的所有需要管理员权限的脚本,它使用runas方式,然后等待输入,再使用sendkeys来发送密码。

这里碰到了与另外一个读者发送给你的脚本同样的问题。密码是以不加密的形式在网络上发送的,这就是为什么我要写这个邮件的原因。

我使用了脚本编码器,本质上它通过编码器来运行脚本并且用加密算法对其进行哈希转换,然后你会得到一个一个.vbe文件,而不是.vbs文件。

我确定这个完全打乱的文件比清晰的要更好些。

为本地管理员准备的使用WMIC的查询

我的第二个技巧是,我将使用VBScript来把兔子从帽子里变出来。开个玩笑啦!

第二个技巧是基于现实中遇到的一个问题的。曾经有一个读者向我提了一个看似简单的问题:你能够列出一台远程机器上的所有本本地管理员帐户吗?

实际情况是这个读者有几十个Windows XP 工作站,而且这些工作站原来都是属于一个工作组的,而用户都拥有这些主机的本地管理员权限(如,他们的本地用户帐户是这台主机上的本地管理员组的成员)。而在后来网络被迁移到一个Active Directory域,用户则被赋予了新的用户帐户,这是域用户全局组成员帐户。

某天,管理员发现一个用户好象拥有的权限超出她之前所被赋予的权限,并且他发现旧的本地管理帐户并没有从她的工作站上删除,而且当域管理用户帐户没有给予足够的控制权限时,她就会使用其中任何一个本地管理帐户登录到工作站。管理员意识到这是个很严重的问题,因为(a)它违背了公司安全性策略,(b)允许用户作为管理员登录到工作站可能导致更高的支持费用。例如,他们可以在工作站上胡乱操作,因为本地管理员几乎可以在自己的机器上做任何事情。

现在让我们考虑更复杂些的问题,她的工作站的内置管理员本地组已经被重命名了,同时内置管理员本地用户帐户也同样被重命名了。检查第二个工作站时发现内置管理员本地组和管理员本地用户帐户也已经被重命名了,但是,他们的新岞号名与第一个工作站的完全不一样!真是让人头疼!

要解决这个问题似乎只有两种方法,一是登录到各个工作站,检查每一台主机的所有本地用户和组,以确定哪些本地用户帐户是这台主机的本地管理员,或者尝试寻找另一种可以确定这个信息的方法。或许用脚本?

你可以写一个脚本解决这个问题,但是在做这之前让我们先尝试一种不同的方法:用Windows ManagementInstrumentation Command-line(WMIC)来实现。WMIC从本质上讲是一个工具(事实上是一个指令解释器),它可以让你直接在命令行上查询WMI信息,而不需要在脚本上进行查询。WMI可以以两种方式来使用:交互地(在命令提示符上每次发一个命令)或者批处理文件。

交互地使用WMIC

例如,假设内置管理员本地组和管理员本地用户帐号在系统上没有被重命名。这种情况下,你可以使用WMIC交互式地显示所有内置管理员本地组列表。打开命令提示符和输入以下命令:

C:Documents and Settingsmyself>wmic path win32_groupuser where (groupcomponent="win32_group.name="administrators",domain="%computername%"")
GroupComponent PartComponent 
win32_group.domain="XP191",name="administrators"?\XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="Administrator" 
win32_group.domain="XP191",name="administrators"?\XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="sjones" 
win32_group.domain="XP191",name="administrators"?\XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="gsmith" 
win32_group.domain="XP191",name="administrators"? \XP191rootcimv2:Win32_Group.Domain="TEST",Name="Domain Admins"

请看第二栏,我们可以看到这台主机上的管理员本地组有三个用户帐号:管理员、sjones 和gsmith。另外,这个主机的域管理员全局组是管理员本地组的一个成员。

但如果这个系统的内置管理员本地组已经被重命名了呢?运行上面的指令将得到以下的结果:

C:Documents and Settingsmyself>wmic path win32_groupuser where (groupcomponent="win32_group.name="administrators",domain="%computername%"")
No Instance(s) Available.

为什么命令失败呢?很明显是因为查询的组名是硬编码到命令中的。但是,如果内置管理员本地组已经被重命名,我们该如何确认它的新名称呢?有一个很简单的方法就是,不管这个组被重命名为什么,实际上它还是原来的那个组。换言之就是,它的安全标识符(SID)没有改变,而且一直都是S-1-5-32-544(请查看KB 243330的已知SID列表)。

那么如果我们知道了它的SID,我们又该如何确定这个组的名字呢?这里,我们可以再次使用WMIC:

C:Documents and Settingsmyself>wmic group where (sid = "S-1-5-32-544" and localaccount = true) get name
Name              
JustAnotherGroup  

这个系统上的内置管理员组是被重命令为JustAnotherGroup了。一个非常聪明但是最终仍然无法保证安全隐藏方法,是吗?不!

不管怎么说,目前我们知道了这个组的名字,我们可以使用WMIC来查询它的成员了:

C:Documents and Settingsmyself>wmic path win32_groupuser where (groupcomponent="win32_group.name="justanothergroup",domain="%computername%"")
GroupComponent PartComponent 
win32_group.domain="XP191",name="justanothergroup"?\XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="JustAnotherUser"? 
win32_group.domain="XP191",name="justanothergroup"? \XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="sjones" 
win32_group.domain="XP191",name="justanothergroup"?\XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="gsmith" 
win32_group.domain="XP191",name="justanothergroup"? \XP191rootcimv2:Win32_Group.Domain="TEST",Name="Domain Admins"

我们可以从命令的输出看到这台主机上有3个本地管理员:sjones、gsmith 和JustAnotherUser。同样,域管理全局组是也JustAnotherUser的一个成员。

在批处理文件中使用WMIC

目前为止一切进展顺利,但问题上我们不想要登录到每个工作站运行这两个WMIC命令。我们能否在一个位置完成这些工作呢?当然可以!WMIC可以通过/node:"<computername>"切换来控制远程计算机,前提是你在目标机器上激活了“远程管理例外”(你可以使用组政策来实现,这已经在这个系列文章的第六部分进行了解释)。因此,假设你已经完成了这些,那么让我们在中心服务器(我们的域控制器)的打开一个命令提示符,并输入这两个相同的WMIC命令,但是这次操作的目标是名为XP191的远程工作站。这样,我们首先得到了这台远程主机的内置管理员本地组的名称:

C:Documents and SettingsAdministrator>wmic /node:"xp191" group where (sid = "S-1-5-32-544" and localaccount = true) get name
Name
JustAnotherGroup

现在,我们可以使用这个结果来得到这个组的一列成员名单:

C:Documents and SettingsAdministrator>wmic /node:"xp191" path win32_groupuser where (groupcomponent = "win32_group.name="justanothergroup",domain="xp191"")
GroupComponent /span>PartComponent 
win32_group.domain="xp191",name="justanothergroup"? \XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="JustAnotherAccount" 
win32_group.domain="xp191",name="justanothergroup"? \XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="sjones" 
win32_group.domain="xp191",name="justanothergroup"? \XP191rootcimv2:Win32_UserAccount.Domain="XP191",Name="gsmith" 
win32_group.domain="xp191",name="justanothergroup"? \XP191rootcimv2:Win32_Group.Domain="TEST",Name="Domain Admins"

这正是我们所要的结果。这样看来,写一个简单的批文件来查询你的网络中的所有工作站并且将结果保存在一个文本文件中是很简单的事,这个结果文本文件你可以留待以后分析。

结论

WMIC是很有意思的,但是有时候也很神秘。我们在这一系列后续文章中继续学习更多它的使用问题。

作者

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的能源管理》等。

相关推荐