Скрипт Powershell, который обнаружит установленное программное обеспечение на клиентах и ​​серверах - PullRequest
0 голосов
/ 06 февраля 2020

Мой модуль powershell не работает должным образом. Я использовал скрипт из галереи Microsoft , который я изменил, потому что, как все мы знаем по Windows, вы можете найти два разных пути реестра, где находится список установленного программного обеспечения.

Итак, вот мой сценарий psm1, который при нацеливании на разные имена хостов в нашем домене всегда возвращает один и тот же результат, мой список программного обеспечения P C:

Function Get-OSCInstalledApplication
{
<#
    .SYNOPSIS
        Get-OSCInstalledApplication is an advanced function which can be used to get installed application on local or remote computer.
    .DESCRIPTION
        Get-OSCInstalledApplication is an advanced function which can be used to get installed application on local or remote computer.
    .PARAMETER  ComputerName
        Gets the installed application on the specified computers. 
    .PARAMETER  ComputerFilePath
        Specifies the path to the CSV file. This file should contain one or more computers. 
    .EXAMPLE
        C:\PS> Get-OSCInstalledApplication -ComputerName "Server201201","Server201202"

        This command will list installed application on 'Server201201' and 'Server201202'.
    .EXAMPLE
        C:\PS> Get-OSCInstalledApplication -ComputerFilePath C:\Script\ComputerList.csv

        This command specifies the path to an item that contains several computers. Then 'Get-OSCInstalledApplication' cmdlet will list installed application from thoese computers.
    .EXAMPLE
        C:\PS> Get-OSCInstalledApplication -ComputerName "Server201201" | Export-Csv -Path C:\installedApps.csv

        This command will list installed application on 'Server201201' and saves the strings in a CSV file.
#>
    [CmdletBinding(DefaultParameterSetName='SinglePoint')]
    Param
    (
        [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName="SinglePoint")]
        [Alias('CName')][String[]]$ComputerName,
        [Parameter(Mandatory=$true, Position=0, ParameterSetName="MultiplePoint")]
        [Alias('CNPath')][String]$ComputerFilePath
    )

    If($ComputerName)
    {
        Foreach($CN in $ComputerName)
        {
            #test compter connectivity
            $PingResult = Test-Connection -ComputerName $CN -Count 1 -Quiet
            If($PingResult)
            {
                FindInstalledApplicationInfo -ComputerName $CN
            }
            Else
            {
                Write-Warning "Failed to connect to computer '$ComputerName'."
            }
        }
    }

    If($ComputerFilePath)
    {
        $ComputerName = (Import-Csv -Path $ComputerFilePath).ComputerName

        Foreach($CN in $ComputerName)
        {
            FindInstalledApplicationInfo -ComputerName $CN
        }
    }

    If($ComputerName)
    {
        Foreach($CN in $ComputerName)
        {
            #test compter connectivity
            $PingResult = Test-Connection -ComputerName $CN -Count 1 -Quiet
            If($PingResult)
            {
                FindInstalledApplicationInfo1 -ComputerName $CN
            }
            Else
            {
                Write-Warning "Failed to connect to computer '$ComputerName'."
            }
        }
    }

    If($ComputerFilePath)
    {
        $ComputerName = (Import-Csv -Path $ComputerFilePath).ComputerName

        Foreach($CN in $ComputerName)
        {
            FindInstalledApplicationInfo1 -ComputerName $CN
        }
    }
}

Function FindInstalledApplicationInfo($ComputerName)
{
    $Objs = @()
    $RegKey = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"

    $InstalledAppsInfos = Get-ItemProperty -Path $RegKey

    Foreach($InstalledAppsInfo in $InstalledAppsInfos)
    {
        $Obj = [PSCustomObject]@{Computer=$ComputerName;
                                 DisplayName = $InstalledAppsInfo.DisplayName;
                                 DisplayVersion = $InstalledAppsInfo.DisplayVersion;
                                 Publisher = $InstalledAppsInfo.Publisher}
        $Objs += $Obj
    }
    $Objs | Where-Object { $_.DisplayName } 
}

Function FindInstalledApplicationInfo1($ComputerName)
{
    $Objs1 = @()
    $RegKey1 = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"

    $InstalledAppsInfos1 = Get-ItemProperty -Path $RegKey1

    Foreach($InstalledAppsInfo1 in $InstalledAppsInfos1)
    {
        $Obj1 = [PSCustomObject]@{Computer=$ComputerName;
                                 DisplayName = $InstalledAppsInfo1.DisplayName;
                                 DisplayVersion = $InstalledAppsInfo1.DisplayVersion;
                                 Publisher = $InstalledAppsInfo1.Publisher}
        $Objs1 += $Obj1
    }
    $Objs1 | Where-Object { $_.DisplayName } 
}

1 Ответ

0 голосов
/ 06 февраля 2020

Сценарий, как он делает, запрашивает ваш локальный компьютер:

 $Objs = @()
 $RegKey = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
 $InstalledAppsInfos = Get-ItemProperty -Path $RegKey

Get-ItemProperty -Path $ RegKey относится к локальному компьютеру.

Имя Computername, которое вы передаете в качестве параметра при вызове этой функции, используется только для создания отчета, который всегда ссылается на ваш локальный компьютер

Вам необходимо реализовать команду invoke и управлять результатами, или используйте готовый скрипт, такой как этот

Вот пример реализации

$outputfile = "$env:userprofile\Servers_$(get-date -f yyyy-MM-dd).log"

$computers = @('host1','host2','host3','host4')
# or
# $computers = get-content HostsListOneperLine.txt
$computers | % {
    write-output "processing $_" # remove if not needed
    if ( test-connection -computername $_ -count 1 -quiet ) {
        Invoke-Command -ComputerName $_ -ScriptBlock {
                Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate 
            }
    }
} | Out-File "$outputfile" -Append 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...