如何知道PowerShell是否安装在远程工作站;我们需要对所有支持PowerShell的工作站进行清点,以便我们可以规划部署的更改;有没有办法远程知道PowerShell是否已安装以及版本是什么?
答案 0 :(得分:3)
检查文件是否存在?
$path= "\\remote\C$\windows\System32\WindowsPowerShell\v1.0\powershell.exe"
if(test-path $path){(ls $path).VersionInfo}
答案 1 :(得分:2)
您可以使用手动运行的批处理脚本或尝试使用GPO(作为启动脚本)。如果未找到powershell,则会将文件my-computer-name.txt
保存为“false”;如果安装了PS,则将保存PS版本(1.0或2.0)。然后你就读了这些文件。
pscheck.bat
@echo off
FOR /F "tokens=3" %%A IN ('REG QUERY "HKLM\SOFTWARE\Microsoft\PowerShell\1" /v Install ^| FIND "Install"') DO SET PowerShellInstalled=%%A
IF NOT "%PowerShellInstalled%"=="0x1" (
echo false > \\remote\location\%COMPUTERNAME%.txt
GOTO end
)
FOR /F "tokens=3" %%A IN ('REG QUERY "HKLM\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine" /v PowerShellVersion ^| FIND "PowerShellVersion"') DO SET PowerShellVersion=%%A
echo %PowerShellVersion% > \\remote\location\%COMPUTERNAME%.txt
:end
注册表中3.0的PSversion值在另一个键(... \ PowerShell \ 3 \ PowerShellEngine)中,但是我在猜测PS3.0没有必要知道,因为它是如此新的并且所有PS脚本都可以使用PS 2.0。
更新:Powershell版本
function Check-PS {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline=$true)]
[String[]]$ComputerName = $env:COMPUTERNAME
)
Process
{
foreach ($computer in $ComputerName)
{
$path = "\\$computer\C$\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$exists = $false
#Check if exists
if(Test-Path $path){
$exists = $true
#Detect version
switch -Wildcard ((Get-ChildItem $path).VersionInfo.ProductVersion)
{
"6.0*" { $ver = 1 }
"6.1*" { $ver = 2 }
"6.2*" { $ver = 3 }
default { $ver = 0 }
}
} else {
Write-Error "Failed to connect to $computer"
$ver = -1
}
#Return object
New-Object pscustomobject -Property @{
Computer = $computer
HasPowerShell = $exists
Version = $ver
}
}
}
}
它支持多个计算机名称并通过管道输入。
Check-PS -ComputerName "Computer1", "Computer2"
或者
"Computer1", "Computer2" | Check-PS
使用localcomputer(默认计算机名)进行测试:
PS > Check-PS
HasPowerShell Computer Version
------------- -------- -------
True FRODE-PC 3