当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 WMI 获取 PowerShell 版本

作者:精品下载站 日期:2024-12-14 07:40:37 浏览:13 分类:玩电脑

使用 WMI 获取 PowerShell 版本


随着 PowerShell 4.0 的发布,您的环境中可能会出现混合系统。我知道我这样做,因为我做了很多编写、测试和开发工作,需要在我的测试网络中使用多个版本。最近,我在做一些组策略工作时,想到了 WMI 过滤器。 WMI 过滤器是一种将组策略限制为满足特定条件的计算机的方法。我认为拥有一个可以确定计算机是否运行 PowerShell 3 还是 4 的 WMI 过滤器会很有用。为什么?原因之一是 v4 机器可以从本地 v4 源更新帮助,v3 也是如此。所以我开始寻找开发 WMI 查询的方法。

这导致了这个的发展:


Function Get-WMIPowerShell {

[cmdletbinding()]
Param(
[Parameter(Position=0,ValueFromPipeline=$True)]
[alias("cn","pscomputername")]
[string[]]$Computername = $env:COMPUTERNAME
)

Begin {
    Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"  

    $wmiParam=@{
     class = 'CIM_datafile'
     filter= ""name='c:\windows\system32\windowspowershell\v1.0\powershell.exe'"
     ComputerName= $Null
     ErrorAction= "Stop"
    }
} #begin

Process {

foreach ($computer in $computername) {
     Write-Verbose "Querying $computer.toUpper())"
     $wmiParam.Computername=$Computer
    Try {
     Get-WMIObject @wmiParam | Select @{name="Computername";Expression={$_.CSName}},
     Name,Version,FileSize,
     @{Name="Installed";Expression={$_.ConvertToDateTime($_.InstallDate)}}
    }
    Catch {
      Write-Warning "Failed to retrieve WMI information from $computername"
      Write-Warning $_.Exception.Message
    }
 } #foreach
} #process

End {
    Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
} #end

} #end function

此函数使用 WMI 检索 PowerShell.exe 的 CIM_DATAFILE 类的实例。我发现在查询此类时,您的查询应尽可能具体。它运行得非常快并返回一些有用的信息。我什至可以为一组计算机运行它。

PS S:\> Get-WMIPowerShell -comp chi-dc01,chi-dc02,chi-dc04,chi-hvr2.globomantics.local,jdhit-dc01,novo8 | out-gridview -title "PS Version"

这给了我这个:

[玩转系统] 使用 WMI 获取 PowerShell 版本

前两台机器运行 PowerShell 2.0,接下来的 2 台 v3 和最后 2 台 v4。现在我知道这是可行的,我可以使用如下查询创建一个 WMI 过滤器:

"Select * from CIM_Datafile where name='c:\windows\system32\windowspowershell\v1.0\powershell.exe' AND version like '6.2%'"

这应该仅过滤运行 PowerShell 3.0 的计算机。

我编写了这个函数,认为我会添加对备用凭据的支持。但如果您不需要它,您也可以使用[WMI]类型加速器获取相同的信息。

PS S:\> [WMI]"\CHI-DC04\root\cimv2:CIM_DataFile.Name='c:\windows\system32\windowspowershell\v1.0\powershell.exe'"


Compressed : False
Encrypted  : False
Size       : 
Hidden     : False
Name       : c:\windows\system32\windowspowershell\v1.0\powershell.exe
Readable   : True
System     : False
Version    : 6.2.9200.16384
Writeable  : True

我需要测试和开发一个 SELECT 查询,这就是为什么我最终得到了我所做的功能。日期信息是额外的,如果您使用 Get-CIMInstance,则会为您转换日期。


$wmiParam=@{
     class = 'CIM_datafile'
     filter= "name='c:\windows\system32\windowspowershell\v1.0\powershell.exe' AND version like '6.2%'"
     ComputerName= 'CHI-DC04'
     ErrorAction= "Stop"
    }

Get-CIMInstance @wmiParam | Select PSComputername,Name,Version,FileSize,InstallDate

是的,我知道您也可以通过 Test-WSMan 获取此信息,这当然是一种更简单的方法。尽管如果碰巧您仍在使用 PowerShell 1.0,我认为这不会起作用。无论如何,你已经拥有了。使用 WMI 查找 PowerShell 版本的快速方法以及可用于为组策略构建 WMI 筛选器的查询。

享受。

11/14 更新
我不知道我最初的查询在想什么。这比需要的要复杂得多。我已经使用更好的过滤器更新了我的代码示例。请记住,在任何路径中使用\时,需要对其进行转义,这就是您看到名称的原因。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯