WindowsInstaller 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/WindowsInstaller.rb +37 -10
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 359306bd86ef11f6e8f78c2b2d6d2420a97e72d0
|
4
|
+
data.tar.gz: bb63a1eafc15aafaa86b4352610d26a5dbdc65c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3d628800ef1b2d8359f2f768fa47aadaabe006958e9f369b7698b7cfab7c7700e531174b9f6beb27eb2c6303a28417f00e5a617fad9d1bb82ee7dfce302fce7
|
7
|
+
data.tar.gz: 290b44b8290aa62f6911b1638de1494ab6f40d604951e58ee526f1178aa9fbd91810def216db3ce8c58e9db831600683127bd8e94dbe57ae5adf0d099ff24684
|
data/lib/WindowsInstaller.rb
CHANGED
@@ -35,6 +35,7 @@ class WindowsInstaller < Hash
|
|
35
35
|
cmd = "#{cmd} /i #{msi_file}"
|
36
36
|
|
37
37
|
msiexec(cmd)
|
38
|
+
raise "Failed to install msi_file: #{msi_file}" unless(msi_installed?(msi_file))
|
38
39
|
end
|
39
40
|
|
40
41
|
def uninstall_msi(msi_file)
|
@@ -45,14 +46,32 @@ class WindowsInstaller < Hash
|
|
45
46
|
|
46
47
|
def uninstall_product_code(product_code)
|
47
48
|
raise "#{product_code} is not installed" unless(product_code_installed?(product_code))
|
48
|
-
|
49
|
+
|
49
50
|
cmd = "msiexec.exe"
|
50
51
|
cmd = "#{cmd} #{self[:mode]}" if(has_key?(:mode))
|
51
52
|
cmd = "#{cmd} /x #{product_code}"
|
52
53
|
msiexec(cmd)
|
54
|
+
if(product_code_installed?(product_code))
|
55
|
+
properties = installed_properties(product_code)
|
56
|
+
raise "Failed to uninstall #{properties['InstalledProductName']} #{properties['VersionString']}"
|
57
|
+
end
|
53
58
|
end
|
54
59
|
|
55
60
|
private
|
61
|
+
def installed_properties(product_code)
|
62
|
+
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
63
|
+
|
64
|
+
hash = Hash.new
|
65
|
+
# known product keywords found on internet. Would be nice to generate.
|
66
|
+
%w[Language PackageCode Transforms AssignmentType PackageName InstalledProductName VersionString RegCompany
|
67
|
+
RegOwner ProductID ProductIcon InstallLocation InstallSource InstallDate Publisher LocalPackage HelpLink
|
68
|
+
HelpTelephone URLInfoAbout URLUpdateInfo InstanceType].sort.each do |prop|
|
69
|
+
value = installer.ProductInfo(product_code, prop)
|
70
|
+
hash[prop] = value unless(value.nil? || value == '')
|
71
|
+
end
|
72
|
+
return hash
|
73
|
+
end
|
74
|
+
|
56
75
|
def msi_properties(msi_file)
|
57
76
|
raise "#{msi_file} does not exist!" unless(File.exists?(msi_file))
|
58
77
|
|
@@ -82,22 +101,30 @@ class WindowsInstaller < Hash
|
|
82
101
|
end
|
83
102
|
|
84
103
|
def msiexec(cmd)
|
85
|
-
cmd = "runas /noprofile /savecred /user:#{self[:administrative_user]} \"#{cmd}\"" if(self.has_key?(:administrative_user))
|
86
|
-
|
87
104
|
cmd_options = { echo_command: false, echo_output: false} unless(self[:debug])
|
88
|
-
|
105
|
+
if(self.has_key?(:administrative_user))
|
106
|
+
msiexec_admin(cmd, cmd_options)
|
107
|
+
else
|
108
|
+
command = CMD.new(cmd, cmd_options)
|
109
|
+
command.execute
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def msiexec_admin(cmd, options)
|
114
|
+
cmd = "runas /noprofile /savecred /user:#{self[:administrative_user]} \"#{cmd}\""
|
115
|
+
|
89
116
|
pre_execute = Sys::ProcTable.ps
|
90
117
|
|
91
|
-
pre_pids =
|
92
|
-
pre_execute.each { |ps| pre_pids
|
118
|
+
pre_pids = []
|
119
|
+
pre_execute.each { |ps| pre_pids << ps.pid }
|
93
120
|
|
94
|
-
command = CMD.new(cmd,
|
121
|
+
command = CMD.new(cmd, options)
|
95
122
|
command.execute
|
96
|
-
|
123
|
+
|
97
124
|
msiexe_pid = 0
|
98
|
-
|
125
|
+
post_execute = Sys::ProcTable.ps
|
99
126
|
post_execute.each do |ps|
|
100
|
-
msiexe_pid = ps.pid if((ps.name.downcase == "msiexec.exe") &&
|
127
|
+
msiexe_pid = ps.pid if((ps.name.downcase == "msiexec.exe") && pre_pids.index(ps.pid).nil?)
|
101
128
|
end
|
102
129
|
|
103
130
|
if(msiexe_pid != 0)
|