Как я могу найти программное обеспечение по пути к файлу, а затем установить его, если оно отсутствует с помощью PowerShell

Я пытаюсь написать сценарий PowerShell, который позволит мне искать старую антивирусную программу на каждом компьютере в моем домене, и, если у него есть эта программа, запустите средство удаления Competitor, которое было предоставлено нам нашим новым поставщиком антивирусного программного обеспечения., Я также хочу, чтобы скрипт искал наше новое программное обеспечение AV, и, если оно отсутствует, установите его. Утилита удаления Competitor и файл.exe для установщика хранятся на контроллере домена и доступны через общий сетевой ресурс. Я включаю удаленное взаимодействие PowerShell в своей организации и надеюсь, что это даст мне больше гибкости. Вот что у меня так далеко:

   #Retrieves list of all computers tied to Active Directory
$computers = Get-Content -Path 'C:\Sophos Results\ADComputers.txt'

#Paths to Sophos Installation and the Sophos Competitor Removal Tool
$SophosInstallPath =  Get-ChildItem -File \\DC-02\netlogon\SophosInstall\Sophos-Installation.bat
$KasperskyRemove = Get-ChildItem -File \\DC-02\netlogon\SophosInstall\AVRemoveW.exe


#Loops through each AD Computer and tests for proper software installation 
ForEach ($computer in $computers)
   {
#Variables that store the path to 32-bit and 64-bit versions of Sophos
$Sophos64 = Test-Path "\\$computer\c$\Program Files\Sophos"
$Sophos32 = Test-Path "\\$computer\c$\Program Files (x86)\Sophos"

#Variables that store the path to 32-bit and 64-bit versions of Kaspersky
$Kaspersky64 = Test-Path "\\$computer\c$\Program Files\Kaspersky Lab"
$Kaspersky32 = Test-Path "\\$computer\c$\Program Files (x86)\Kaspersky Lab"

#The following block will run the Sophos Installation batch file, removing any instance of Kaspersky and installing Sophos
      If ($Sophos64 -eq $false -or $Sophos32 -eq $false) 
      {
      Start-Process -FilePath $SophosInstallPath -Verbose
      Write-Host "Beginning Sophos Installation on $computer"
      }
#The following block will remove Kaspersky from a machine if it is present and Sophos is already installed.
        Elseif (($Kaspersky64 -eq $true -or $Kaspersky32 -eq $true) -and ($Sophos64 -eq $true -or $Sophos32 -eq $true)) 
        {
        Start-Process -FilePath $KasperskyRemove -Verbose
        Write-Host "Removing Kaspersky from $computer"
        }
#The last block will only be executed if Sophos is installed and Kaspersky isn't, and makes no changes to the machine.
        else {Write-Host "$computer has the proper AV software installation"}
   }

В настоящий момент, когда я запускаю это на группе тестовых компьютеров, я не получаю никаких ошибок, и я знаю, что скрипт правильно определяет, установлен ли Kaspersky/Sophos, но он не запускает Удаление Конкурента. Инструмент или установочный файл. Я знаю, что после включения удаленного взаимодействия PowerShell появится лучший способ сделать это, я просто не уверен, что это за способ. Какие-либо предложения? заранее спасибо

Обновить:

Я включил PS Remoting на локальном компьютере и попробовал следующее:

Invoke-Command -ComputerName localhost -ScriptBlock { *Script from above* }

Я получил следующие ошибки:

Access is denied
    + CategoryInfo          : PermissionDenied: (\\dc-02\net...nstallation.bat:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : localhost   Cannot find path '\\dc-02\netlogon\SophosInstall\Sophos-Installation.bat' because it does not exist.
    + CategoryInfo          : ObjectNotFound: (\\dc-02\net...nstallation.bat:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : localhost   Access is denied
    + CategoryInfo          : PermissionDenied: (\\dc-02\net...l\AVRemoveW.exe:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : localhost   Cannot find path '\\dc-02\netlogon\SophosInstall\AVRemoveW.exe' because it does not exist.
    + CategoryInfo          : ObjectNotFound: (\\dc-02\net...l\AVRemoveW.exe:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : localhost   Cannot validate argument on parameter 'FilePath'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command  again.
    + CategoryInfo          : InvalidData: (:) [Start-Process], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.StartProcessCommand
    + PSComputerName        : localhost

Я запускаю PowerShell из моей учетной записи администратора домена, поэтому я не уверен, почему в нем говорится, что доступ запрещен. Спасибо за вашу помощь, я немного новичок в ИТ и PowerShell. Два месяца на моей первой работе

Мой последний вопрос: когда я буду готов сделать это в более широком масштабе, скажите, что моя тестовая группа состоит из 3 компьютеров (1 с Kaspersky, 1 с Sophos и 1 с ни с одним). Должно работать следующее: да?:

 $computers = Get-Content -Path 'C:\Sophos Results\TestGroup.txt'

Invoke-Command -ComputerName $computers -ScriptBlock { *Original Script here* }

Любые предпочтения между Invoke-Command и Enter-PSSession при работе с несколькими компьютерами? В описании Invoke-Command говорится: "Чтобы запустить одну команду на удаленном компьютере, используйте параметр ComputerName. Для запуска серии связанных команд, которые обмениваются данными, используйте командлет New-PSSession". Поэтому, если я использую Invoke- Команда (которая кажется мне более простой) Должен ли я сохранить свой сценарий и затем вызвать его в блоке сценария? И тогда это заставляет меня задуматься, как бы я вызывал скрипт с моей локальной машины на удаленной машине? Я прошу прощения за так много вопросов, моя голова просто кружится, чем дальше я спускаюсь сюда по кроличьей норе.

Обновление 19/19/2018:

Встретить еще один вопрос, надеясь, что это последний. Я скопировал файлы с удаленного сервера на свой локальный компьютер, чтобы избавиться от проблемы второго прыжка. Я просто скопирую файлы со своего локального компьютера на все удаленные машины в сценарии. Проблема в том, что когда я копирую данные с локального на удаленный, это работает только тогда, когда я указываю имя компьютера следующим образом

Copy-Item -Path C:\Temp\AVInstall -Destination '\\Computer1\c$\Temp\AVInstall' -Recurse

Если я пытаюсь использовать компьютерную переменную, как показано ниже, я получаю ошибку сетевого пути не найдена:

Copy-Item -Path C:\Temp\AVInstall -Destination '\\$computer\c$\Temp\AVInstall' -Recurse

Любая причина, почему это может быть?

1 ответ

Как затронул EBGreen, вы сейчас запускаете его на локальной машине.

Вам нужно будет запустить его на удаленной машине через интерактивную сессию PSSession или вызов сценария.

Использовать Invoke-Command Вы можете поместить скрипт, который будет выполняться на удаленной машине, в блок скриптов. Затем он вызывается на каждом компьютере в массиве строк внутри -computername аргумент.

Я не могу проверить это, однако я думаю, что вы можете столкнуться с проблемой двойного прыжка при попытке получить элементы $SophosInstallPathа также$KasperskyRemove, Если это произойдет, это, скорее всего, проявится по принципу "доступ запрещен". Если это произойдет, наиболее простым решением будет, скорее всего, сначала скопировать элементы на компьютер, либо с помощью copy-item или более надежный robocopy.exe а затем удалите их после завершения.

#Retrieves list of all computers tied to Active Directory
$computers = Get-Content -Path 'C:\Sophos Results\ADComputers.txt'

$scriptblock = {
    #Paths to Sophos Installation and the Sophos Competitor Removal Tool
    $SophosInstallPath = Get-Item -File "\\DC-02\netlogon\SophosInstall\Sophos-Installation.bat"
    $KasperskyRemove = Get-Item -File "\\DC-02\netlogon\SophosInstall\AVRemoveW.exe"

    #Variables that store the path to 32-bit and 64-bit versions of Sophos
    $Sophos64 = Test-Path "\Program Files\Sophos"
    $Sophos32 = Test-Path "\Program Files (x86)\Sophos"

    #Variables that store the path to 32-bit and 64-bit versions of Kaspersky
    $Kaspersky64 = Test-Path "\Program Files\Kaspersky Lab"
    $Kaspersky32 = Test-Path "\Program Files (x86)\Kaspersky Lab"

    #The following block will run the Sophos Installation batch file, removing any instance of Kaspersky and installing Sophos
    If ($Sophos64 -eq $false -or $Sophos32 -eq $false) 
    {
        Start-Process -FilePath $SophosInstallPath -Verbose
        Write-Host "Beginning Sophos Installation on $computer"
    }
    #The following block will remove Kaspersky from a machine if it is present and Sophos is already installed.
    Elseif (($Kaspersky64 -eq $true -or $Kaspersky32 -eq $true) -and ($Sophos64 -eq $true -or $Sophos32 -eq $true)) 
    {
        Start-Process -FilePath $KasperskyRemove -Verbose
        Write-Host "Removing Kaspersky from $env:computer"
    }
    #The last block will only be executed if Sophos is installed and Kaspersky isn't, and makes no changes to the machine.
    else 
    {
        Write-Host "$env:computer has the proper AV software installation"
    }
}

Invoke-Command -ComputerName $computers -ScriptBlock $scriptblock
Другие вопросы по тегам