@@ -15,6 +15,7 @@ use FusionInventory::Agent::Tools;
1515use FusionInventory::Agent::Tools::Win32;
1616use FusionInventory::Agent::Tools::Win32::Constants;
1717use FusionInventory::Agent::Tools::Win32::LoadIndirectString;
18+ use Data::Dumper;
1819
1920our $runAfter = [" FusionInventory::Agent::Task::Inventory::Win32::OS" ];
2021
@@ -66,7 +67,7 @@ sub doInventory {
6667
6768 if ($is64bit ) {
6869 my $softwares32 = _getSoftwaresList(
69- path => " HKEY_LOCAL_MACHINE/ SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall" ,
70+ path => " SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall" ,
7071 is64bit => 0
7172 ) || [];
7273 foreach my $software (@$softwares32 ) {
@@ -120,12 +121,13 @@ sub _loadUserSoftware {
120121 my $userName = $userList -> {$profileName }
121122 or next ;
122123
123- my $profileSoft = " HKEY_USERS/ $profileName /SOFTWARE/" ;
124+ my $profileSoft = " $profileName /SOFTWARE/" ;
124125 $profileSoft .= is64bit() && !$is64bit ?
125126 " Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall" :
126127 " Microsoft/Windows/CurrentVersion/Uninstall" ;
127128
128129 my $softwares = _getSoftwaresList(
130+ root => " HKEY_USERS" ,
129131 path => $profileSoft ,
130132 is64bit => $is64bit ,
131133 userid => $profileName ,
@@ -143,22 +145,22 @@ sub _loadUserSoftware {
143145sub _getUsersFromRegistry {
144146 my (%params ) = @_ ;
145147
146- my $ profileList = getRegistryKey (
147- path => ' HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProfileList ' ,
148- wmiopts => { # Only used for remote WMI optimization
149- values => [ qw/ ProfileImagePath Sid / ] ,
150- }
148+ my % profileList = getNewRegistryAll (
149+ logger => $params { logger } ,
150+ root => " HKEY_LOCAL_MACHINE " ,
151+ path => " SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProfileList " ,
152+ %params
151153 );
152154
153- next unless $ profileList ;
155+ return unless % profileList ;
154156
155157 my $userList ;
156- foreach my $profileName (keys %$ profileList ) {
158+ foreach my $profileName (keys %profileList ) {
157159 next unless $profileName =~ m { /$} ;
158160 next unless length ($profileName ) > 10;
159161
160- my $profilePath = $profileList -> {$profileName }{ ' / ProfileImagePath' };
161- my $sid = $profileList -> {$profileName }{ ' / Sid' };
162+ my $profilePath = $profileList {$profileName }-> { ProfileImagePath };
163+ my $sid = $profileList {$profileName }-> { Sid };
162164 next unless $sid ;
163165 next unless $profilePath ;
164166 my $user = basename($profilePath );
@@ -196,9 +198,7 @@ sub _keyLastWriteDateString {
196198
197199 return unless ($OSNAME eq ' MSWin32' );
198200
199- return unless (ref ($key ) eq " Win32::TieRegistry" );
200-
201- my @lastWrite = FileTimeToSystemTime($key -> Information(" LastWrite" ));
201+ my @lastWrite = FileTimeToSystemTime($key -> {_lastWrite });
202202
203203 return unless (@lastWrite > 3);
204204
@@ -208,53 +208,52 @@ sub _keyLastWriteDateString {
208208sub _getSoftwaresList {
209209 my (%params ) = @_ ;
210210
211- my $softwares = getRegistryKey(
212- path => " HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall" ,
213- wmiopts => { # Only used for remote WMI optimization
214- values => [ qw/
215- DisplayName Comments HelpLink ReleaseType DisplayVersion
216- Publisher URLInfoAbout UninstallString InstallDate MinorVersion
217- MajorVersion NoRemove SystemComponent
218- / ]
219- },
211+ my $path = " SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall" ;
212+ my $root = " HKEY_LOCAL_MACHINE" ;
213+ if (defined $params {path }) {
214+ $path = $params {path };
215+ }
216+ if (defined $params {root }) {
217+ $root = $params {root };
218+ }
219+
220+ my %softwares = getNewRegistryAll(
221+ logger => $params {logger },
222+ root => $root ,
223+ path => $path ,
220224 %params
221225 );
226+ return unless %softwares ;
222227
223228 my @list ;
224229
225- return unless $softwares ;
226-
227- foreach my $rawGuid (keys %$softwares ) {
230+ foreach my $rawGuid (keys %softwares ) {
228231 # skip variables
229232 next if $rawGuid =~ m { ^/} ;
230233
231234 # only keep subkeys with more than 1 value
232- my $data = $softwares -> {$rawGuid };
235+ my $data = $softwares {$rawGuid };
233236 next unless keys %$data > 1;
234237
235- my $guid = $rawGuid ;
236- $guid =~ s /\/ $// ; # drop the tailing /
237-
238238 my $software = {
239239 FROM => " registry" ,
240- NAME => encodeFromRegistry($data -> {' /DisplayName' }) ||
241- encodeFromRegistry($guid ), # folder name
242- COMMENTS => encodeFromRegistry($data -> {' /Comments' }),
243- HELPLINK => encodeFromRegistry($data -> {' /HelpLink' }),
244- RELEASE_TYPE => encodeFromRegistry($data -> {' /ReleaseType' }),
245- VERSION => encodeFromRegistry($data -> {' /DisplayVersion' }),
246- PUBLISHER => encodeFromRegistry($data -> {' /Publisher' }),
247- URL_INFO_ABOUT => encodeFromRegistry($data -> {' /URLInfoAbout' }),
248- UNINSTALL_STRING => encodeFromRegistry($data -> {' /UninstallString' }),
249- INSTALLDATE => _dateFormat($data -> {' /InstallDate' }),
250- VERSION_MINOR => hex2dec($data -> {' /MinorVersion' }),
251- VERSION_MAJOR => hex2dec($data -> {' /MajorVersion' }),
252- NO_REMOVE => hex2dec($data -> {' /NoRemove' }),
240+ NAME => $data -> {DisplayName } || $rawGuid , # folder name
241+ COMMENTS => $data -> {Comments },
242+ HELPLINK => $data -> {HelpLink },
243+ RELEASE_TYPE => $data -> {ReleaseType },
244+ VERSION => $data -> {DisplayVersion },
245+ PUBLISHER => $data -> {Publisher },
246+ URL_INFO_ABOUT => $data -> {URLInfoAbout },
247+ UNINSTALL_STRING => $data -> {UninstallString },
248+ INSTALLDATE => _dateFormat($data -> {InstallDate }),
249+ VERSION_MINOR => $data -> {MinorVersion },
250+ VERSION_MAJOR => $data -> {MajorVersion },
251+ NO_REMOVE => $data -> {NoRemove },
253252 ARCH => $params {is64bit } ? ' x86_64' : ' i586' ,
254- GUID => $guid ,
253+ GUID => $rawGuid ,
255254 USERNAME => $params {username },
256255 USERID => $params {userid },
257- SYSTEM_CATEGORY => $data -> {' / SystemComponent' } && hex2dec( $data -> { ' /SystemComponent ' }) ?
256+ SYSTEM_CATEGORY => $data -> {SystemComponent } ?
258257 CATEGORY_SYSTEM_COMPONENT : CATEGORY_APPLICATION
259258 };
260259
@@ -347,17 +346,17 @@ sub _processMSIE {
347346 " Internet Explorer (64bit)" : " Internet Explorer" ;
348347
349348 # Will use key last write date as INSTALLDATE
350- my $installedkey = getRegistryKey(
349+ my %installedkey = getNewRegistryValues(
350+ logger => $params {logger },
351+ root => " HKEY_LOCAL_MACHINE" ,
351352 path => is64bit() && !$params {is64bit } ?
352- " HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Internet Explorer" :
353- " HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer" ,
354- wmiopts => { # Only used for remote WMI optimization
355- values => [ qw/ svcVersion Version/ ],
356- subkeys => 0
357- }
353+ " SOFTWARE/Wow6432Node/Microsoft/Internet Explorer" :
354+ " SOFTWARE/Microsoft/Internet Explorer" ,
355+ %params
358356 );
359357
360- my $version = $installedkey -> {" /svcVersion" } || $installedkey -> {" /Version" };
358+
359+ my $version = $installedkey {svcVersion } || $installedkey {Version };
361360
362361 return unless $version ; # Not installed
363362
@@ -368,8 +367,8 @@ sub _processMSIE {
368367 ARCH => $params {is64bit } ? ' x86_64' : ' i586' ,
369368 NAME => $name ,
370369 VERSION => $version ,
371- PUBLISHER => " Microsoft Corporation" ,
372- INSTALLDATE => _dateFormat(_keyLastWriteDateString($ installedkey ))
370+ PUBLISHER => " Microsoft Corporation"
371+ # INSTALLDATE => _dateFormat(_keyLastWriteDateString(% installedkey))
373372 }
374373 );
375374
0 commit comments