
좋습니다. 저는 WiX를 사용하여 상속하고 설치 프로그램을 구축한 사용자 지정 Windows 양식 앱의 배포를 간소화하려는 C# 프로그래머입니다. 이 앱은 변경하면서 정기적으로 다시 설치해야 합니다. 저는 관리 유형 항목(또는 vbs, WMI, 터미널 서버, Citrix, 심지어 WiX 및 MSI도 제가 일반적으로 다루는 항목이 아님)에 익숙하지 않지만 지금까지는 몇 가지 vbs를 구성하고 최종 목표를 가지고 있습니다. 마음에. msi는 작동하며 내 개발 컴퓨터의 매핑된 O: 드라이브에서 설치했고 RDP는 citrix 컴퓨터에 설치했습니다.
최종 목표:내 개발 컴퓨터에 작성되고 MSI로 컴파일된 코드(WiX의 범위와 Windows Installer 엔진이 허용하는 모든 것 내에서 개선할 수 있음)를 내 사용자가 액세스할 수 있는 Citrix 컴퓨터 클러스터에 배포합니다.
원격 컴퓨터에서 MSI를 실행하려면 스크립트에서 무엇을 놓치고 있습니까?
공들여 나열한 것:
- 머신 A는 내 개발 머신이고 vbs 스크립트와 msi 파일(XP SP3)이 있습니다.
- 머신 C1 - C6은 msi(Server 2003 R2 SP2)를 통해 애플리케이션을 설치해야 하는 Citrix 서버입니다.
- 선택적으로 모든 시스템이 액세스할 수 있는 공유 네트워크 리소스도 있습니다.
스크립트:
'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
또한 이것을 사용하여 설치를 시도했지만 오류 코드를 반환하지 않지만 msi도 설치하지 않으며 사용자 변경 /install 명령이 실제로 작동하는지 궁금합니다.
errReturn = objProcess.Create _
("cmd.exe /c msiexec /i ""O:\Citrix Deployment\Setup.msi"" /quiet")
Wscript.Echo errReturn
@tony 파일은 잘 복사되지만 다음과 같은 결과가 나타납니다.
ERROR:
Code = 0x80070005
Description = Access is denied.
Facility = Win32
Citrix 시스템에 대해 다른 사용자 계정(동일한 도메인)을 사용해야 하기 때문에 다음을 사용했습니다.
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer( .....
마침내 Tony의 입력과 제안을 바탕으로 Powershell 스크립트를 사용했는데 훨씬 더 깔끔하게 보이고 작동합니다.
Win32_Product 클래스 설치 방법을 가져오는 것은 여전히 약간 복잡해 보이지만(WMIC 명령에 비해) Technet에서 제안하는 내용은 다음과 같습니다.
링크 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")
}
답변1
한 시트릭스에는 자체 배포 기술이 있는데, 두 번째로 배포 방법이 어떤 식으로든 실패한다는 말씀이신가요? 그렇다면 가장 문제가 될 것으로 예상됩니다. 그러나 나는 당신의 설명으로는 정말로 알 수 없습니다.
다음은 첫 번째
복사본 file.msi \citrixservername\c$\pathtoyourfile에 있는 모든 코드에 대한 바로가기입니다.
wmic /node:citrixservername 제품 호출 install true,"" , "c:\PathToYour\File.msi"
설치 파일이 먼저 서버에 로컬로 복사됩니다. 이렇게 하지 않으면 가장 문제가 발생하게 됩니다!