![](/img/trans.png)
[英]Uninstalling msi via msiexec fails with a 'only valid for applications installed' message
[英]Need to copy a file via puppet only if a Windows MSI package is not installed
我是在Windows上使用up的新手。 我正在尝试从我们网络上的共享文件夹安装MSI软件包,但是要获得权限,共享文件夹是“只读”的,它没有“执行”权限,因此当木偶代理运行并尝试安装时, MS,它失败。
我要做的是仅在需要安装软件包的情况下才将MSI安装程序复制到本地目录。
这就是我安装软件包并将其复制到本地目录的方式:
class app_install {
package { '7-Zip 9.38 (x64 edition)':
provider => windows,
ensure => installed,
source => 'c:\\temp\7zip_testInstall.msi',
install_options => ['INSTALLDIR=C:\apps64\7-Zip'],
}
file { 'c:/temp/7zip_testInstall.msi':
ensure => 'file',
mode => '0660',
group => 'Domain Users',
source => 'c:\\temp\7zip_testInstall.msi',
}
当我运行puppet并发现未安装该软件包时,它将文件复制到ac:\\ temp,然后继续安装该软件包。 这是预期的行为。 在随后运行puppet代理时,它会发现该软件包已安装,因此跳过安装,但是如果c:\\ temp中缺少安装程序,则会继续将安装程序再次复制到c:\\ temp-鉴于事实这是一个临时文件夹,它经常被清除。
我要避免的是如果软件包已安装,则复制安装程序。
我不确定该怎么做。
请指教,谢谢!
Fr3edom21。
我能够回答我的问题。
我没有使用“文件资源”将MSI从网络共享复制到c:\\ temp,仅在缺少该程序的卸载注册表项版本值的情况下,才通过“ exec资源”执行文件副本。 像这样:
exec { 'copy MSI to c:\temp':
command => 'C:\\windows\system32\cmd.exe /c "copy \\server\repo\7zip_testinstall.msi c:\\temp"',
unless => 'C:\Windows\System32\reg.exe query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{23170F69-40C1-2702-0938-00000100000 /f 9.38.00.0',
}
希望这对有类似问题的人有所帮助。
如果您选择这条路线,请注意以下几点:
C:\\Windows\\System32
实际上(通过Windows的File System Redirector ) 重定向到C:\\Windows\\SystemWOW64
位system32二进制文件C:\\Windows\\SystemWOW64
其中。 如果要使用64位system32二进制文件,则应考虑使用c:\\Windows\\sysnative
。 如果您使用的是64位版本的Puppet,则不会受到此问题的影响,并且不应使用sysnative,因为它不存在。 如果使用Puppet 3.7.3+,则可以使用$system32
事实来处理混合环境。 有关更多信息,请参见在Windows上处理文件路径 。 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall
是四个可能的位置之一。 同样,对于32位Puppet,除非使用注册表模块,否则您将受到注册表重定向的约束。 如果该软件可以32位安装,则可能需要检查它是否也存在于HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall
(如果您正在运行64位Puppet或不受注册表限制)重定向器。 Fr3edom21。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.