通过Powershell远程管理卸载程序

时间:2015-11-27 13:20:21

标签: powershell credentials runas invoke-command start-process

我正在开发一个小型软件部署脚本,它使用PowerShell远程卸载并安装新版本的Check_MK

一切都很好 - 我可以本地化旧服务,停止它并确定它的安装路径。问题是运行" uninstall.exe"服务。

使用带有凭据参数的服务器上的Powershell会话日志记录可以轻松完成此操作。

$passwd = convertto-securestring -AsPlainText -Force -String "password"
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "domain\user",$passwd
$session = new-pssession -computername "192.xxx.xxx.xxx" -credential $cred
Enter-PSSession $session

问题是你不能在脚本中使用PSSession - 它是为个人使用而非自动化。

所以我尝试使用Powershells Invoke-Command cmdlet。

Invoke-Command -Computername "192.xxx.xxx.xxx" -credential $cred -argumentlist $cred -ScriptBlock {
    # Lots of stuff and enter uninstall directory

    uninstall.exe /S
}

调用exe文件以查询管理员凭据结束。

我还尝试远程启动一个提升的Powershell会话并将其用于卸载..

Start-Process powershell -Credential $cred

使用提升的Powershell会话执行位于服务器上用于启动uninstall.exe的脚本在UAC查询中结束(不查询凭据,但要求执行)。

还有其他解决办法吗?我尝试了很多,但没有任何效果。

3 个答案:

答案 0 :(得分:2)

这是使用计划任务的另一种方法。

使用登录的用户凭据在本地创建任务,当然您必须拥有远程计算机的管理员权限。

Function Run-RemoteCommand
{

Param(

[Parameter(Mandatory = $true)]
[String]
$Computer,

[Parameter(Mandatory = $true)]
[String]
$Task,

[Switch]
$Background

)

$TaskName = "TempTask"
$Explorer=gwmi win32_process -ComputerName $Computer | ? {$_.ProcessName -eq "explorer.exe" }
$OWner = $Explorer.GetOwner().Domain + "\" + $Explorer.GetOwner().User
if ($Background)
{
$Create = "SCHTASKS /Create /TN ""$TaskName"" /RU System /TR ""$Task"" /SC Once /ST 22:30"
}
Else
{
$Create = "SCHTASKS /Create /TN ""$TaskName"" /RU $Owner /TR ""$Task"" /SC Once /ST 22:30"
}
$Runit = "SCHTASKS /Run /TN ""$TaskName"""
$Delete = "SCHTASKS /Delete /TN ""$TaskName"" /F"
$WMI = Get-WmiObject -List Win32_Process -ComputerName $Computer 
$WMI.Create($Create)
$WMI.Create($Runit)
Sleep 2
$WMI.Create($Delete)
}

运行它:

Run-RemoteCommand -Computer "192.xxx.xxx.xxx" -Task 'c:\path\uninstall.exe /S'

如果你想以“NT AUTHORITY \ SYSTEM”的形式运行它,请添加-Background Switch

答案 1 :(得分:0)

最好的方法是始终将本地shell作为提升用户运行。这允许您在不在脚本中提供凭据的情况下启动invoke-command。

以管理员用户身份运行Powershell后,您可以使用invoke-command运行脚本。我一直这样做。

如果您正在安排此任务,则必须将任务作为提升用户运行。这再次阻止您必须在脚本中以明文形式输入密码。

答案 2 :(得分:0)

您没有提及它是否在域上下文中。

如果它位于域上下文中,您可以使用组策略对象中的启动脚本来实现目标。它将在下次重新启动工作站时执行。

您也可以在没有组策略的情况下执行此操作,但这意味着单独访问每台计算机并更改本地组策略对象 - 此时,您可以运行powershell脚本。

另一种解决方案:您可以创建.zap文件并使用组策略的软件部署功能进行部署。这有点滥用系统。 .zap文件用于安装未包装在MSI文件中的软件,但您也可以使用它来启动卸载软件的脚本。通常,无法卸载.zap文件。

第三种选择:从http://www.chocolatey.org下载Chocolatey。这是一个PowerShell脚本,可以为您管理许多标准软件的安装。在每个工作站上配置它以自动运行(使用调度程序等)。为您的软件创建一个NuGet包(NuGet就是Chocolatey在底层运行的),并根据需要使用chocolatey来部署或取消部署您的软件。

另外,您可能需要考虑将其转换为MSI文件,而不是滚动您自己的安装程序 - 这些文件可以轻松安装和卸载,甚至可以远程安装,而无需过多的UAC麻烦。您也可以使用NullSoft安装程序,但这些安装程序更难以远程自动化。 MSI是微软的官方安装方法。

有些人也围绕标准的.exe类型安装程序创建了MSI包装器。