欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

Windows PowerShell每周提示(17):使用Get-WMIObject修改可读写属性

那么你最喜欢的Windows PowerShell cmdlet是哪一个?好的,如果你是系统管理员,你最喜欢的cmdlet可能是Get-WMIObject。毕竟,Get-WMIObject(这使你能从Windows PowerShell中访问WMI)不仅能实现系统管理工作,也是Windows PowerShell 1.0中为数不多的几个能针对远程计算机使用的cmdlet之一。为什么不去喜欢呢?

好的,冒着吹毛求疵的风险,有一件事:一眼看上去,似乎我们不能使用Get-WMIObject来修改一个可读写属性的值。例如,看一下这个VBScript脚本,这个脚本能将LoggingLevel的默认属性值从1(开)修改至0(关):

Set objWMIService = GetObject("winmgmts:\\atl-fs-01\root\cimv2")

 

Set colItems = objWMIService.ExecQuery("Select * From Win32_WMISetting")

 

For Each objItem in colItems

    objItem.LoggingLevel = 0

    objItem.Put_

Next

如你所见,这很简单:我们简单的将值0赋值给LoggingLevel属性,然后调用Put_方法来将新值保存到操作系统中。没有比这更简单的了。

现在,让我们在PowerShell中尝试下同样的事:

$a = Get-WMIObject Win32_WMISetting –computername atl-fs-01

$a.LoggingLevel = 0

$a.Put_

如果我们运行这个脚本,它运行起来会很正常,并且不会产生错误信息。然后,如果我们看一下LoggingLevel属性值的话,我们将会看到,啊不:

1

噢,亲爱的,这不是我们所要期待的,完全不是。取而代之的是,我们期待LoggingLevel的值等于0。等一下,我们知道错在哪了。在Windows PowerShell中方法后必须跟上一对括号。让我们将最后一行代码改成下面所示的:

$a.Put_()

现在,让我们重新运行脚本来看看会发生什么:

Method invocation failed because [System.Management.ManagementObject#root\cimv2\Win32_WMISetting]

doesn't contain a  method named 'Put_'.

At line:1 char:8

+ $a.Put_( <<<< )

呃,根据错误提示没有类似名为Put_的方法。这真古怪;毕竟VBScript使用Put_方法时没有任何问题。噢,好的,显然你不能使用Windows PowerShell修改可读写属性的值。来得容易去得也快。我们下周见。

等下,别走。这回我们确实知道问题在哪了(保证)。事实上,在Windows PowerShell中你能像使用VBScript来修改属性值一样简单。实际上,Windows PowerShell的代码是这样的:

$a = Get-WMIObject Win32_WMISetting –computername atl-fs-01

$a.LoggingLevel = 0

$a.Put()

那么我们在这里所做得有什么不同么?只有一件事,我们调用Put方法而不是Put_方法。这就是我们所做的。只需调用Put方法,你就能使用Windows PowerShell改变LoggingLevel(或其它可读写属性)的值了。

问得好:那为什么我们在VBScript中使用Put_方法而在Windows PowerShell中使用Put方法呢?好的,为了避免太深入,简单说来,当你使用VBScript编写WMI脚本时你利用了WMI的脚本API。在脚本API中,SWbemObject对像使用Put_方法来保存对可读写属性的修改。

相反的,Windows PowerShell使用.NET Framework System.Management类来访问WMIWindows PowerShell使用System.Management.ManagementObject类胜于使用SWbemObject。不论好坏,这个类使用名为Put的方法来保存对可读写属性的更改。理想上,SWbemObjectSystem.Management.ManagementObject愿意使用相同名称的方法,但是基于某些原因,它们不会。

但是不要太担心这个。就在你的Windows PowerShell脚本中使用Put(而在你的VBSscript脚本中使用Put_),那么我们从此以后将一直幸福地生活下去。

英文原文

http://www.microsoft.com/technet/scriptcenter/resources/pstips/sept07/pstip0928.mspx

已发表 2007年11月18日 19:16 作者 ghjconan

评论

禁止匿名发表评论