
У меня есть пользователь, который работает из дома, но он подключен к нашей внутренней сети. У меня есть программа удаленного доступа (LANDESK), которую я могу подключить к его системе, но согласно политике нашего офиса я не могу удалять программы, пока не войду в свою специальную учетную запись администратора. Переключение учетных записей отключает этого пользователя от VPN, фактически выкидывая меня из его системы.
Итак, как новичок в PowerShell, я пытаюсь придумать способ запустить команду для выполнения деинсталлятора программного обеспечения от имени моей учетной записи администратора, пока он все еще вошел в систему. Желательно в тихом режиме. Windows 10 v1803. Программное обеспечение — SSMS 2014, если это поможет.
Спасибо за предложения.
решение1
В PowerShell это сделать очень просто.
Приведенный ниже блок скрипта возьмет имя компьютера, ваше имя пользователя и пароль, подключится к удаленному компьютеру и выведет список всего установленного программного обеспечения по имени:
$computerName = "SomeComputerName"
$yourAccount = Get-Credential
Invoke-Command -ComputerName $computerName -Credential $yourAccount -ScriptBlock {
Get-WmiObject Win32_Product | Select Name
}
Когда у вас есть название продукта, который вы хотите удалить удаленно, вы можете выполнить удаление следующим образом:
$computerName = "SomeComputerName"
$appName = "AppName"
$yourAccount = Get-Credential
Invoke-Command -ComputerName $computerName -Credential $yourAccount -ScriptBlock {
Get-WmiObject Win32_product | Where {$_.name -eq $appName} | ForEach {
$_.Uninstall()
}
}
В приведенных выше примерах замените «SomeComputerName» на имя компьютера, с которого вы хотите выполнить удаление.
При желании вы также можете заставить скрипт запрашивать имя компьютера с помощью следующей строки:
$computerName = Read-Host "Enter Computer Name"
Если у вас есть несколько компьютеров с одним и тем же программным обеспечением, которое вы хотите удалить, вы также можете определить массив компьютеров для работы и выполнять удаление с большого количества машин:
$computerNames = @("SomeComputerName1", "SomeComputerName2", "SomeComputerName3")
$appName = "AppName"
$yourAccount = Get-Credential
ForEach ($computerName in $computerNames) {
Invoke-Command -ComputerName $computerName -Credential $yourAccount -ScriptBlock {
Get-WmiObject Win32_product | Where {$_.name -eq $appName} | ForEach {
$_.Uninstall()
}
}
}
решение2
Если вы создадите файл с именем «servers.txt» и поместите в него список серверов, вы также можете ссылаться на $computerNames следующим образом:
$computerNames = Get-Content "C:\some-directory\servers.txt"
$appName = "AppName"
$yourAccount = Get-Credential
ForEach ($computerName in $computerNames) {
Invoke-Command -ComputerName $computerName -Credential $yourAccount -ScriptBlock {
Get-WmiObject Win32_product | Where {$_.name -eq $appName} | ForEach {
$_.Uninstall()
}
}
}
Я использовал этот подход много раз в производственных средах, и он, похоже, работает для меня. Всегда проверяйте это в непроизводственной среде, прежде чем завершать в рабочей среде.