Remoto instalando um msi em servidores citrix usando o WMI

2

OK, sou um programador C # que está tentando simplificar a implantação de um aplicativo de formulário personalizado do Windows que herdei e criei um instalador com o WiX (esse aplicativo precisará ser reinstalado regularmente enquanto eu estou fazendo alterações nele ). Eu não estou realmente acostumado a coisas do tipo admin (ou vbs, ou WMI, ou servidores de terminal, ou Citrix, e até mesmo WiX e MSI não são coisas que eu costumo lidar) mas até agora eu juntei alguns vbs e tenho um objetivo final em mente. O msi funciona, e eu o instalei da unidade O: mapeada em minha máquina dev e enquanto o RDP tinha uma máquina citrix.

Objetivo final: implantar código escrito em minha máquina dev e compilado em um MSI (que eu possa melhorar dentro dos limites do WiX e do que o mecanismo do Windows Installer permitir) para o cluster de máquinas Citrix meus usuários têm acesso a.

O que eu estou perdendo no meu script para fazer o MSI executar nas máquinas remotas?

Layout:

  • A máquina A é minha máquina dev e possui o script vbs e o arquivo msi (XP SP3)
  • As máquinas C1 - C6 são os Citrix Servers que precisam do aplicativo instalado através do msi (Server 2003 R2 SP2)
  • Há também, opcionalmente, um recurso de rede compartilhado que todas as máquinas podem acessar.

Script:

'Set WMI Constants
Const wbemImpersonationLevelImpersonate = 3
Const wbemAuthenticationLevelPktPrivacy = 6

'Set whether this is installing to the debug Citrix Servers
Const isDebug = true

'Set MSI location
'Network location yields error 1619 (This installation package could not be opened.)
msiLocation = "\255.255.255.255\odrive\Citrix Deployment\Setup.msi"
'Directory on machine A yields error 3 (file not found)
'msiLocation = "C:\Temp\Deploy\Setup.msi"
'Mapped network drive (on both machines) yield error 3 (file not found)
'msiLocation = "O:\Citrix Deployment\Setup.msi"

'Set login information
strDomain = "MyDomain" 
Wscript.StdOut.Write "user name:"
strUser = Wscript.StdIn.ReadLine 
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "password:"
strPassword = objPassword.GetPassword()

'Names of Citrix Servers
Dim citrixServerArray
If isDebug Then
    citrixServerArray = array("C4")
Else
    'citrixServerArray = array("C1","C2","C3","C5","C6")
End If

'Loop through each Citrix Server
For Each citrixServer in citrixServerArray

    'Login to remote computer
    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objWMIService = objLocator.ConnectServer(citrixServer, _
        "root\cimv2", _
         strUser, _
         strPassword, _
         "MS_409", _
         "ntlmdomain:" + strDomain)

    'Set Remote Impersonation level
    objWMIService.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate
    objWMIService.Security_.AuthenticationLevel = wbemAuthenticationLevelPktPrivacy

    'Reference to a process on the machine
    Dim objProcess : Set objProcess = objWMIService.Get("Win32_Process")

    'Change user to install for terminal services
    errReturn = objProcess.Create _
        ("cmd.exe /c change user /install", Null, Null, intProcessID)   
    WScript.Echo errReturn

    'Install MSI here
    'Reference to a product on the machine
    Set objSoftware = objWMIService.Get("Win32_Product")
    'All users set in option parameter, I'm led to believe that the third parameter is actually ignored
    'http://www.webmasterkb.com/Uwe/Forum.aspx/vbscript/2433/Installing-programs-with-VbScript
    errReturn = objSoftware.Install(msiLocation,"ALLUSERS=2 REBOOT=ReallySuppress",True)
    Wscript.Echo errReturn

    'Change user back to execute
    errReturn = objProcess.Create _
        ("cmd.exe /c change user /execute", Null, Null, intProcessID)
    WScript.Echo errReturn

Next

Eu também tentei usar isso para instalar, ele não retorna um código de erro, mas também não instala o MSI, e isso me faz pensar se o comando change user / install está realmente funcionando.

errReturn = objProcess.Create _
    ("cmd.exe /c msiexec /i ""O:\Citrix Deployment\Setup.msi"" /quiet")
Wscript.Echo errReturn

@tony O arquivo é copiado, mas então eu entendo:

ERROR:
Code = 0x80070005
Description = Access is denied.
Facility = Win32

Eu preciso usar outra conta de usuário (mesmo domínio) para as máquinas Citrix, e é por isso que usei:

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer( .....

Eu finalmente usei um script de powershell para isso com base na sugestão e na contribuição de Tony, e ele parece e age muito mais limpo.

Embora a obtenção do método de instalação da classe Win32_Product ainda pareça um pouco confusa (em comparação com o comando WMIC), mas é o que a Technet sugere:

link link

#$servers = 'C1' , 'C2', 'C3' , 'C5', 'C6'
$servers = , 'C4'
$MyCredential = Get-Credential MyDomain\otherusername

foreach($server in $servers)
{
    Copy-Item -LiteralPath C:\Temp\Deploy\Setup.msi -Destination \$server\c$\Temp\Setup.msi -Force
    (Get-WmiObject -ComputerName $server -Credential $MyCredential -List | '
    Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install("C:\TEMP\Setup.msi")
}
    
por capn 16.06.2010 / 18:02

1 resposta

2

para um citrix tem sua própria tecnologia de implantação, segundo você está dizendo que o seu método de implantação falha de alguma forma? Se assim for, espero que seja um problema de representação. Mas eu não posso dizer pela sua explicação.

o seguinte é um atalho para todo o código que você tem

Copiar file.msi \ citrixservername \ c $ \ pathtoyourfile

wmic / node: citrixservername instalação da chamada do produto true, "", "c: \ PathToYour \ File.msi"

observe que o arquivo de instalação é copiado localmente para o servidor 1o, se você não fizer isso, você terá um problema de roubo de identidade!

    
por 16.06.2010 / 21:10