
OK, ich bin ein C#-Programmierer, der versucht, die Bereitstellung einer benutzerdefinierten Windows-Formular-App zu optimieren, die ich geerbt und für die ich mit WiX ein Installationsprogramm erstellt habe (diese App muss regelmäßig neu installiert werden, da ich Änderungen daran vornehme). Ich bin nicht wirklich an Admin-Sachen gewöhnt (oder VBS, WMI, Terminalserver, Citrix und sogar WiX und MSI sind keine Dinge, mit denen ich normalerweise zu tun habe), aber bisher habe ich einige VBS zusammengestellt und habe ein Endziel vor Augen. Das MSI funktioniert und ich habe es vom zugeordneten O:-Laufwerk auf meinem Entwicklungscomputer und per RDP mit einem Citrix-Computer installiert.
Endziel:Stellen Sie auf meiner Entwicklungsmaschine geschriebenen und in ein MSI kompilierten Code (den ich im Rahmen von WiX und den Möglichkeiten der Windows Installer Engine verbessern kann) im Cluster der Citrix-Maschinen bereit, auf die meine Benutzer Zugriff haben.
Was fehlt in meinem Skript, damit das MSI auf den Remotecomputern ausgeführt wird?
Layout:
- Maschine A ist meine Entwicklungsmaschine und verfügt über das VBS-Skript und die MSI-Datei (XP SP3).
- Die Maschinen C1 – C6 sind die Citrix-Server, auf denen die Anwendung über die MSI installiert werden muss (Server 2003 R2 SP2).
- Optional gibt es auch eine gemeinsam genutzte Netzwerkressource, auf die alle Maschinen zugreifen können.
Skript:
'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
Ich habe auch versucht, dies zur Installation zu verwenden. Es gibt keinen Fehlercode zurück, installiert aber auch nicht die MSI-Datei und ich frage mich, ob der Befehl „change user /install“ überhaupt wirklich funktioniert.
errReturn = objProcess.Create _
("cmd.exe /c msiexec /i ""O:\Citrix Deployment\Setup.msi"" /quiet")
Wscript.Echo errReturn
@tony Das Kopieren der Datei funktioniert einwandfrei, aber dann erhalte ich Folgendes:
ERROR:
Code = 0x80070005
Description = Access is denied.
Facility = Win32
Ich muss für die Citrix-Rechner ein anderes Benutzerkonto (allerdings dieselbe Domäne) verwenden, weshalb ich Folgendes verwendet habe:
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer( .....
Basierend auf Tonys Eingaben und Vorschlägen habe ich hierfür schließlich ein Powershell-Skript verwendet, und es sieht viel sauberer aus und funktioniert auch so.
Obwohl das Abrufen der Installationsmethode der Klasse Win32_Product immer noch etwas kompliziert aussieht (verglichen mit dem WMIC-Befehl), ist es das, was Technet vorschlägt:
Verknüpfung 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")
}
Antwort1
Erstens hat Citrix seine eigene Bereitstellungstechnologie. Zweitens meinen Sie, dass Ihre Bereitstellungsmethode irgendwie fehlschlägt? Wenn ja, gehe ich davon aus, dass es sich um ein Identitätsdiebstahlproblem handelt. Aber das kann ich aus Ihrer Erklärung nicht wirklich sagen.
das folgende ist eine Abkürzung zu dem gesamten Code, den Sie haben
1.
Kopiere file.msi \citrixservername\c$\pathtoyourfile
wmic /node:citrixservername product call install true,"" , "c:\PfadZuIhrer\Datei.msi"
Beachten Sie, dass die Installationsdatei zuerst lokal auf den Server kopiert wird. Wenn Sie dies nicht tun, tritt ein Identitätsdiebstahl-Problem auf.