2 votes

Installation à distance d'un msi sur des serveurs Citrix à l'aide de WMI

OK, je suis un programmeur C# qui essaie de rationaliser le déploiement d'une application Windows form personnalisée dont j'ai hérité et pour laquelle j'ai construit un installateur avec WiX (cette application devra être réinstallée régulièrement car j'y apporte des modifications). Je ne suis pas vraiment habitué aux choses de type administratif (ou vbs, ou WMI, ou serveurs de terminaux, ou Citrix, et même WiX et MSI ne sont pas des choses avec lesquelles j'ai l'habitude de travailler) mais jusqu'à présent j'ai assemblé quelques vbs et j'ai un objectif final en tête. Le msi fonctionne, et je l'ai installé à partir du lecteur O : mappé sur ma machine de développement et en RDP sur une machine Citrix.

Objectif final : Déployer du code écrit sur ma machine de développement et compilé dans un MSI (que je peux améliorer dans les limites de WiX et de ce que le moteur d'installation Windows permet) vers le cluster de machines Citrix auquel mes utilisateurs ont accès.

Que manque-t-il dans mon script pour que le MSI s'exécute sur les machines distantes ?

Mise en page :

  • La machine A est ma machine de développement, et a le vbs script et le fichier msi (XP SP3).
  • Les machines C1 à C6 sont les serveurs Citrix qui ont besoin de l'application installée via le msi (Server 2003 R2 SP2).
  • Il existe également, en option, une ressource réseau partagée à laquelle toutes les machines peuvent accéder.

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

J'ai également essayé d'utiliser cette commande pour installer, elle ne renvoie pas de code d'erreur, mais n'installe pas le msi non plus, et cela me fait me demander si la commande change user /install fonctionne vraiment.

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

@tony Le fichier se copie bien, mais ensuite j'obtiens ceci :

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

J'ai besoin d'utiliser un autre compte utilisateur (dans le même domaine cependant) pour les machines Citrix, c'est pourquoi j'ai utilisé :

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

J'ai finalement utilisé un script powershell pour cela, en me basant sur l'apport et la suggestion de Tony, et cela semble et agit beaucoup plus proprement.

Bien que l'obtention de la méthode d'installation de la classe Win32_Product semble encore un peu alambiquée (par rapport à la commande WMIC), mais c'est ce que suggère Technet :

http://blogs.msdn.com/b/wmi/archive/2010/01/06/wmic-vs-wmi-powershell-cmdlets.aspx http://technet.microsoft.com/en-us/library/dd347651.aspx

#$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")
}

2voto

tony roth Points 3814

D'abord, citrix a sa propre technologie de déploiement, ensuite vous dites que votre méthode de déploiement échoue d'une manière ou d'une autre ? Si c'est le cas, je pense qu'il s'agit d'un problème d'impersonnalisation. Mais je ne peux pas vraiment le dire à partir de votre explication.

ce qui suit est un raccourci vers tout le code que vous avez
1er
copier le fichier.msi \citrixservername\c $ \pathtoyourfile

wmic /node:citrixservername product call install true,"" , "c : \PathToYour\File.msi "

remarquez que le fichier d'installation est copié localement sur le serveur en premier, si vous ne le faites pas, vous aurez un problème d'usurpation d'identité !

0 votes

Merci d'avoir raccourci ce que je voulais faire. Cependant, j'ai obtenu une erreur d'accès refusé, je dois me connecter avec un autre compte utilisateur (même domaine) sur les machines Citrix.

0 votes

Oui, connectez-vous au domaine avec un compte qui a le droit d'administration sur les serveurs Citrix.

0 votes

Ok j'ai ajouté /user:otherusername après le switch /node et ça s'est installé, je vais devoir jouer avec plus pour que ça fonctionne complètement avec le boucle for. merci.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X