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

2008-10-13    | |
打印本文章
RSS

导读:如何使用Windows Management Instrumentation Command-line (WMIC)进行远程查询。

关键词:WMIC Windows网络

正在加载数据...

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

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

【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:" & "domain\user" & " " & Chr(34) & "cscript c:\PCQuery.vbs" & Chr(34)
Wscript.Sleep 800
WshShell.AppActivate WshEnv("SystemRoot") & "\system32\runas.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 Settings\myself>wmic path win32_groupuser where (groupcomponent="win32_group.name=\"administrators\",domain=\"%computername%\"")
GroupComponent PartComponent 
win32_group.domain="XP191",name="administrators"?\\XP191\root\cimv2:Win32_UserAccount.Domain="XP191",Name="Administrator" 
win32_group.domain="XP191",name="administrators"?\\XP191\root\cimv2:Win32_UserAccount.Domain="XP191",Name="sjones" 
win32_group.domain="XP191",name="administrators"?\\XP191\root\cimv2:Win32_UserAccount.Domain="XP191",Name="gsmith" 
win32_group.domain="XP191",name="administrators"? \\XP191\root\cimv2:Win32_Group.Domain="TEST",Name="Domain Admins"

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

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

C:\Documents and Settings\myself>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 Settings\myself>wmic group where (sid = "S-1-5-32-544" and localaccount = true) get name
Name              
JustAnotherGroup  

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

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

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

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

在批处理文件中使用WMIC

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

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

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

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

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

结论

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

查看全文
 
在使用DameWare Mini Remote Control工具远程管理局域网中的Winodws XP SP2工作站时,发现系统总是弹出拒绝远程连接的提示,对此我们该如何解决呢?
 
如何检查一个运行Windows Server 2003的计算机的网络IP配置如何通过执行一些简单的命令行(CL)PING测试来诊断网络连接问题?
 
在网络故障修复中使用PING命令将有助于减小Windows PC连接问题原因的分析范围。本文中所介绍的TCP/IP诊断方法将有利于我们了解PING的使用语法……
 
在网络故障修复中使用PING命令将有助于减小Windows PC连接问题原因的分析范围。本文中所介绍的TCP/IP诊断方法将有利于我们了解PING的使用语法……
 
问:在哪里我能找到升级Windows Server 2003到 Windows Server 2008的分步指南?您能给我一些建议吗?
VPN(Virtual Private Network),即“虚拟专用网络”,是对企业内部网的扩展。虚拟专用网可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。
网络是复杂的,网络出现故障的原因是多种多样的,那么我们该如何诊断网络故障,修复网络故障的方法有哪些呢,以及如何来进行网络故障的修复呢?在修复网络故障的过程中,我们常常会遇到许多问题,那么有没有什么可以遵循的原则呢?
网络管理员也负责网络备份、测试备份和灾难恢复过程。这对于电源或硬件故障、数据和/或网络问题以及物理灾难问题的恢复是至关重要的。
最新更新
专家答疑
技巧
David Minutella
编号640-503 的CCNP路由测试与编号640-504的CCNP的交换测试有什么不同之处?如果我一直在做网络管理员,并且已经取得了CCNA认证,那么我考取哪个认证更好呢?
Ed Tittel
随着经济的衰退, 有抱负的IT网络人员以及经验老道的职场人士开始重新审视就业市场。本文将探讨如何在网络领域中生存,甚至走上蓬勃发展之路。
Lindi Horton
问:我们公司有50位用户以及一个小型的数据存储和因特网服务器机房。我们从大集团总部的无线连接访问因特网和进行电子邮件交流,但是我们只有一个很小的域控制器。

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录