1

Я хотел бы удалить все 7-почтовые программы до версии менее 16.00 и установить последнюю версию. Если существует версия выше 16, тогда ничего не делайте.

Я попытался сделать это с помощью объектов групповой политики в параметре установки программного обеспечения для параметров программного обеспечения в конфигурации компьютера. Объект групповой политики появляется в RSoP компьютера, но рядом с элементом в настройках gpedit.msc на тестовом компьютере появляется желтый восклицательный знак.

По предложению Rabbid10 я попробовал следующее:

$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}

$FilteredApps = New-Object System.Collections.ArrayList

foreach ($App in $AllRegAppEntries) {
    if ($App.DisplayName -ilike "*7-Zip*") {

        try {
            $DisplayVersionAsVersion = New-Object System.Version $App.DisplayVersion
        } catch {
            $DisplayVersionAsVersion = New-Object System.Version
        }

        $VersionToCheck = New-Object System.Version "16.0.0.0"

    echo "versionToCheck is:"
    echo $versionToCheck

    echo "DisplayVersionAsVersion is currently: "
    echo $DisplayVersionAsVersion


        if ($DisplayVersionAsVersion -gt $VersionToCheck) {
            [void]$FilteredApps.Add($App)
        }
    }
}

Echo "last part of script"

foreach ($App in $FilteredApps) {
    echo "Hi, Im in the uninstall section"
    # Make sure uninstall string uses MSIEXEC
    if ($App.UninstallString -ilike "msiexec*") {
        $GUID = $App.UninstallString.Substring($App.UninstallString.IndexOf("{"))
        $GUID = $GUID.Substring(0, $GUID.IndexOf("}") + 1)
        Write-Host "Running the following command: msiexec.exe /x $GUID /qn /norestart"
        Start-Process "msiexec.exe" "/x $GUID /qn /norestart" -Wait
    }
} 

И мой вывод выглядит так:

1 ответ1

2

Чтобы сделать это, вам фактически нужно найти в реестре ключи удаления продукта, который вы хотите удалить, по имени и версии. Вы можете использовать PowerShell для этого, сначала собрав все установленные приложения с помощью Get-ChildItem:

$AllRegAppEntries = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object {Get-ItemProperty -Path $_.pspath}

Когда у вас есть все записи, вы можете отфильтровать их на основе DisplayName и DisplayVersion. Для этого вы можете сделать что-то вроде этого:

$FilteredApps = New-Object System.Collections.ArrayList

foreach ($App in $AllRegAppEntries) {
    if ($App.DisplayName -ilike "*7-Zip*") {

        try {
            $DisplayVersionAsVersion = New-Object System.Version $App.DisplayVersion
        } catch {
            $DisplayVersionAsVersion = New-Object System.Version
        }

        $VersionToCheck = New-Object System.Version "16.0.0.0"

        if ($DisplayVersionAsVersion -lt $VersionToCheck) {
            [void]$FilteredApps.Add($App)
        }
    }
}

После того, как у вас есть все приложения, соответствующие вашим критериям поиска, вам нужно будет получить GUID этих приложений. Вы можете получить это из UninstallString элемента реестра. Получив GUID, вы сможете удалить Start-Process продукта и передать GUID в msiexec с параметрами удаления:

foreach ($App in $FilteredApps) {
    # Make sure uninstall string uses MSIEXEC
    if ($App.UninstallString -ilike "msiexec*") {
        $GUID = $App.UninstallString.Substring($App.UninstallString.IndexOf("{"))
        $GUID = $GUID.Substring(0, $GUID.IndexOf("}") + 1)
        Write-Host "Running the following command: msiexec.exe /x $GUID /qn /norestart"
        Start-Process "msiexec.exe" "/x $GUID /qn /norestart" -Wait
    }
} 

Надеюсь, это поможет.

ОБНОВЛЕНИЕ: настроенный код для поиска приложения перед попыткой получить версию и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .