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

[玩转系统] 我的 Test-WSMan 替代品的更多改进

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

我的 Test-WSMan 替代品的更多改进


最近我分享了我为 Test-WSMan 编写的替换函数。该版本解决了原始命令中的一些缺点,至少对我来说是这样。使用了一段时间后,我意识到我需要一些额外的更改,所以我现在有了版本 2。新版本现在支持多个计算机名称。我还用操作系统、服务包和堆栈编号的单独属性替换了 ProductVersion 属性。

[玩转系统] 我的 Test-WSMan 替代品的更多改进

我使用正则表达式来解析原始属性。

#parse the product version line into separate properties
[regex]$rx = "OS:\s(?\S+)\sSP:\s(?\d\.\d)\sStack:\s(?\d\.\d)"
$pv = $test.productVersion
        
[string]$os = ($rx.Matches($pv)).foreach({$_.groups["OS"].value})

#force these as strings and later treat them as [decimal]
[string]$sp = ($rx.Matches($pv)).foreach({$_.groups["SP"].value})
[string]$stack = ($rx.Matches($pv)).foreach({$_.groups["Stack"].value})

最终输出会放弃 ProductVersion 属性,转而使用这些属性。这使得更容易过滤掉旧计算机。

[玩转系统] 我的 Test-WSMan 替代品的更多改进

我用一些其他示例更新了帮助。新版本仍然作为要点放在 GitHub 上。

Test-MyWsMan.ps1:

#requires -version 4.0
#requires -module Microsoft.WSMan.Management




Function Test-MyWsman {
Test-MyWsman

Computername    : WIN81-ENT-01
wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
OS              : 6.3.9600
SP              : 0.0
Stack           : 3.0

This command determines whether the WinRM service is running on the local computer or on a remote computer.

.EXAMPLE
PS C:\>Test-MyWsman -computername server01

Computername    : SERVER01
wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
OS              : 6.2.9200
SP              : 0.0
Stack           : 3.0

This command determines whether the WinRM service is running on the server01 computer named.

.EXAMPLE
PS C:\> test-mywsman chi-p50 -Credential globomantics\administrator -Authentication Default

Computername    : CHI-P50
wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
OS              : 10.0.14300 
SP              : 0.0 
Stack           : 3.0

Test a connection using an alternate credential.
.EXAMPLE

PPS C:\> "chi-hvr2","chi-hvr1","chi-dc01","chi-p50","chi-dc04" | where {Test-MyWsman -ComputerName $_ -quiet }
chi-hvr2
chi-dc01
chi-p50
chi-dc04

Using the -Quiet parameter filter out computer names that can't be reached.

.EXAMPLE
PS C:\> test-mywsman "chi-dc01","chi-dc02","chi-dc04" | Select Computername,OS,SP,Stack

Computername OS       SP  Stack
------------ --       --  -----
CHI-DC01     6.1.7601 1.0 3.0  
CHI-DC02     6.1.7600 0.0 2.0  
CHI-DC04     6.2.9200 0.0 3.0  

Test multiple computers and display selected information.

.EXAMPLE
PS C:\> test-mywsman chi-dc01,chi-dc02,chi-dc04 | where stack -ge 3.0 | get-ciminstance win32_operatingsystem | Select PSComputername,Caption

PSComputerName Caption                                     
-------------- -------                                     
CHI-DC01       Microsoft Windows Server 2008 R2 Enterprise 
CHI-DC04       Microsoft Windows Server 2012 Datacenter   

Test several computers and filter out those with a WSMan stack version less than 3. Computers with a stack version of 3 are piped to Get-CimInstance.
.NOTES
Updated: 2 June 2016
Version: 2.0
Author : Jeff Hicks

Learn more about PowerShell:
http://jdhitsolutions.com/blog/essential-powershell-resources/

  ****************************************************************
  * DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED *
  * THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK.  IF   *
  * YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, *
  * DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING.             *
  ****************************************************************
.INPUTS
[string]

.OUTPUTS
[pscustomobject]

.LINK
https://gist.github.com/jdhitsolutions/8ed8ac39130cd84e87409e948122d442

.LINK
Test-WsMan
Connect-WSMan
Disable-WSManCredSSP
Disconnect-WSMan
Enable-WSManCredSSP
Get-WSManCredSSP
Get-WSManInstance
Invoke-WSManAction
New-WSManInstance
New-WSManSessionOption
Remove-WSManInstance
Set-WSManInstance
Set-WSManQuickConfig

#>
[CmdletBinding()]
Param(

    [Parameter(Position=0, ValueFromPipeline)]
    [Alias('cn')]
    [ValidateNotNullorEmpty()]
    [string[]]$ComputerName = $env:COMPUTERNAME,

    [Alias('auth','am')]
    [ValidateNotNullOrEmpty()]
    [Microsoft.WSMan.Management.AuthenticationMechanism]$Authentication,

    [Parameter(ParameterSetName='ComputerName')]
    [ValidateNotNullOrEmpty()]
    [ValidateRange(1, 2147483647)]
    [int]$Port,

    [Parameter(ParameterSetName='ComputerName')]
    [switch]$UseSSL,

    [Parameter(ParameterSetName='ComputerName')]
    [ValidateNotNullOrEmpty()]
    [string]$ApplicationName,

    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [Alias('cred','c')]
    [ValidateNotNullOrEmpty()]
    [pscredential]
    [System.Management.Automation.CredentialAttribute()]$Credential,

    [ValidateNotNullOrEmpty()]
    [string]$CertificateThumbprint,

    [Switch]$Quiet
)

Begin {

    Write-Verbose "Starting $($MyInvocation.Mycommand)"
    Write-Verbose "Using parameter set $($PSCmdlet.ParameterSetName)"
    #remove Quiet from PSBoundParameters since Test-WSMan doesn't use it
    if ($Quiet) {
        $PSBoundParameters.Remove("Quiet") | Out-Null
    }

    #add Default authentication if nothing else is specified
    #so that ProductVersion is filled out
    if (-NOT $PSBoundParameters.ContainsKey("Authentication")) {
        $PSBoundParameters.Add("Authentication","Default")
    }
    Write-Verbose ($PSBoundParameters | Out-String)

} #begin

Process {

Foreach ($computer in $Computername) {
    Write-Verbose "Testing $Computer"
    #modify PSBoundparameters
    $PSBoundParameters.Computername = $computer
    Try {
        $test = Test-WSMan @PSBoundParameters -ErrorAction Stop
 
    }
    Catch {
        Write-Verbose "[$Computer] FAILED with error"
        #capture error
        $wsmanError = $_
    }

    if ($Quiet -AND $Test) {
        #user asked for -Quiet and there is a test result
        $True
    }
    elseif ($Quiet) {
        #user asked for a result and if this block is reached,
        #there was no result
        $False
    }
    elseif ($wsmanError) {
        #if there is an error, write it
        write-error $wsmanError
    }
    else {
        #parse the product version line into separate properties
        [regex]$rx = "OS:\s(?\S+)\sSP:\s(?\d\.\d)\sStack:\s(?\d\.\d)"
        $pv = $test.productVersion
        
        [string]$os = ($rx.Matches($pv)).foreach({$_.groups["OS"].value})

        #force these as strings and later treat them as [decimal]
        [string]$sp = ($rx.Matches($pv)).foreach({$_.groups["SP"].value})
        [string]$stack = ($rx.Matches($pv)).foreach({$_.groups["Stack"].value})
       
        #write custom result to the pipeline
        $test | Select-Object -property @{Name="Computername";Expression={$Computer.ToUpper()}},
        wsmid,protocolVersion,ProductVendor,
        @{Name="OS";Expression={$OS}},@{Name="SP";Expression={$SP -as [decimal]}},
        @{Name="Stack";Expression={$Stack -as [decimal]}}
    }
    #reset variables
    Clear-Variable wsmanError,Test -ErrorAction SilentlyContinue -Force
 } #foreach computern
} #process

End {
   
    Write-Verbose "Ending $($MyInvocation.Mycommand)"

} #end

} #end function Test-MyWsman

我将根据需要更新那里的代码。我对错误处理有其他想法,因此将来可能会有一些细微的变化。我也没有针对 Windows 服务器以外的其他任何东西进行测试。 WSMan 的重点在于它是其他平台可以使用的标准协议。我希望有人针对非 Windows 设备对此进行测试,并在 GitHub 上的评论中报告您的发现。

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

取消回复欢迎 发表评论:

关灯