Как я могу найти программное обеспечение по пути к файлу, а затем установить его, если оно отсутствует с помощью 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