Remote registry-StdRegProv

0

I'm new to using Powershell and have been tasked with gathering varies parts of information from varies networks that our company maintains. All parts of my script work but the part that gathers the Office version from the remote computers. This is a adaption of someone else's script. Local IP address works as expected but report IP's return error "You cannot call a method on a null-valued expression" with script as is. If the "Invoke-Command" line is remove (line39) we get"Get-WmiObject : Could not get objects from namespace"Root..."Access denied" I suspect it's because local pc can't read remote registry within this part of the script. Any help/pointers welcome

     $server=""
     $cred=Get-Credential
     $ipv4 = (Test-Connection -ComputerName $env:ComputerName -Count 
     1).IPV4Address.IPAddressToString

     ##Off Info 
     $HKLM = [UInt32] "0x80000002"
     $HKCR = [UInt32] "0x80000000"

     $excelKeyPath = "Excel\DefaultIcon"
     $wordKeyPath = "Word\DefaultIcon"

     $installKeys = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
               'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'

     $officeKeys = 'SOFTWARE\Microsoft\Office',
              'SOFTWARE\Wow6432Node\Microsoft\Office'

     $defaultDisplaySet = 'DisplayName','Version', 'ComputerName'

     $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultDisplaySet)
     $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet) 

     ## Off Info
     $results = new-object PSObject[] 0;
     $MSexceptionList = "mui","visio","project","proofing","visual"
     ## Off Info

     ## Office info start
     $results=@()
     if ($server -ne $IPv4 ){ 
     $os =Invoke-Command -computername $server -Credential $cred -scriptblock{Get-WmiObject Win32_OperatingSystem}
     } else {
     $os=Get-WMIObject win32_operatingsystem -computername $server
     }

     $osArchitecture = $os.OSArchitecture

     if ($server -ne $IPv4 ){
     $regprov=Invoke-Command -Computername $server -Credential $cred -scr 
     iptblock{Get-WmiObject -ClassName StdRegProv -Namespace root/default }  
     }else { 
     $regProv = Get-Wmiobject -list "StdRegProv" -namespace "root\default" - 
     computername $Server
     }

     [System.Collections.ArrayList]$VersionList = New-Object -TypeName System.Collections.ArrayList
     [System.Collections.ArrayList]$PathList = New-Object -TypeName System.Collections.ArrayList
     [System.Collections.ArrayList]$PackageList = New-Object -TypeName System.Collections.ArrayList
     [System.Collections.ArrayList]$ClickToRunPathList = New-Object -TypeName System.Collections.ArrayList
     [System.Collections.ArrayList]$ConfigItemList = New-Object -TypeName  System.Collections.ArrayList
     $ClickToRunList = new-object PSObject[] 0;

     foreach ($regKey in $officeKeys) {
     $officeVersion = $regProv.EnumKey($HKLM, $regKey)
     foreach ($key in $officeVersion.sNames) {
      if ($key -match "\d{2}\.\d") {
        if (!$VersionList.Contains($key)) {
          $AddItem = $VersionList.Add($key)
        }

        $path = join-path $regKey $key

        $configPath = join-path $path "Common\Config"
        $configItems = $regProv.EnumKey($HKLM, $configPath)
        if ($configItems) {
           foreach ($configId in $configItems.sNames) {
             if ($configId) {
                $Add = $ConfigItemList.Add($configId.ToUpper())
             }
           }
        }

        $cltr = New-Object -TypeName PSObject
        $cltr | Add-Member -MemberType NoteProperty -Name InstallPath -Value 
        ""
        $cltr | Add-Member -MemberType NoteProperty -Name UpdatesEnabled - 
        Value $false
        $cltr | Add-Member -MemberType NoteProperty -Name UpdateUrl -Value 
        ""
        $cltr | Add-Member -MemberType NoteProperty -Name StreamingFinished -Value $false
        $cltr | Add-Member -MemberType NoteProperty -Name Platform -Value ""
        $cltr | Add-Member -MemberType NoteProperty -Name ClientCulture -Value ""

        $packagePath = join-path $path "Common\InstalledPackages"
        $clickToRunPath = join-path $path "ClickToRun\Configuration"
        $virtualInstallPath = $regProv.GetStringValue($HKLM, $clickToRunPath, "InstallationPath").sValue

        [string]$officeLangResourcePath = join-path  $path "Common\LanguageResources"
        $mainLangId = $regProv.GetDWORDValue($HKLM, $officeLangResourcePath, "SKULanguage").uValue
        if ($mainLangId) {
            $mainlangCulture = [globalization.cultureinfo]::GetCultures("allCultures") | where {$_.LCID -eq $mainLangId}
            if ($mainlangCulture) {
                $cltr.ClientCulture = $mainlangCulture.Name
            }
        }

        [string]$officeLangPath = join-path  $path "Common\LanguageResources\InstalledUIs"
        $langValues = $regProv.EnumValues($HKLM, $officeLangPath);
        if ($langValues) {
           foreach ($langValue in $langValues) {
              $langCulture = [globalization.cultureinfo]::GetCultures("allCultures") | where {$_.LCID -eq $langValue}
           } 
        }

        if ($virtualInstallPath) {

        } else {
          $clickToRunPath = join-path $regKey "ClickToRun\Configuration"
          $virtualInstallPath = $regProv.GetStringValue($HKLM, $clickToRunPath, "InstallationPath").sValue
        }

        if ($virtualInstallPath) {
           if (!$ClickToRunPathList.Contains($virtualInstallPath.ToUpper())) {
              $AddItem = $ClickToRunPathList.Add($virtualInstallPath.ToUpper())
           }

           $cltr.InstallPath = $virtualInstallPath
           $cltr.StreamingFinished = $regProv.GetStringValue($HKLM, $clickToRunPath, "StreamingFinished").sValue
           $cltr.UpdatesEnabled = $regProv.GetStringValue($HKLM, $clickToRunPath, "UpdatesEnabled").sValue
           $cltr.UpdateUrl = $regProv.GetStringValue($HKLM, $clickToRunPath, "UpdateUrl").sValue
           $cltr.Platform = $regProv.GetStringValue($HKLM, $clickToRunPath, "Platform").sValue
           $cltr.ClientCulture = $regProv.GetStringValue($HKLM, $clickToRunPath, "ClientCulture").sValue
           $ClickToRunList += $cltr
        }

        $packageItems = $regProv.EnumKey($HKLM, $packagePath)
        $officeItems = $regProv.EnumKey($HKLM, $path)

        foreach ($itemKey in $officeItems.sNames) {
          $itemPath = join-path $path $itemKey
          $installRootPath = join-path $itemPath "InstallRoot"

          $filePath = $regProv.GetStringValue($HKLM, $installRootPath, "Path").sValue
          if (!$PathList.Contains($filePath)) {
              $AddItem = $PathList.Add($filePath)
          }
        }

        foreach ($packageGuid in $packageItems.sNames) {
          $packageItemPath = join-path $packagePath $packageGuid
          $packageName = $regProv.GetStringValue($HKLM, $packageItemPath, "").sValue

          if (!$PackageList.Contains($packageName)) {
            if ($packageName) {
               $AddItem = $PackageList.Add($packageName.Replace(' ', '').ToLower())
            }
          }
        }

      }
   }
}

foreach ($regKey in $installKeys) {
    $keyList = new-object System.Collections.ArrayList
    $keys = $regProv.EnumKey($HKLM, $regKey)

    foreach ($key in $keys.sNames) {
       $path = join-path $regKey $key
       $installPath = $regProv.GetStringValue($HKLM, $path, "InstallLocation").sValue
       if (!($installPath)) { continue }
       if ($installPath.Length -eq 0) { continue }

       $buildType = "64-Bit"
       if ($osArchitecture -eq "32-bit") {
          $buildType = "32-Bit"
       }

       if ($regKey.ToUpper().Contains("Wow6432Node".ToUpper())) {
          $buildType = "32-Bit"
       }

       if ($key -match "{.{8}-.{4}-.{4}-1000-0000000FF1CE}") {
          $buildType = "64-Bit" 
       }

       if ($key -match "{.{8}-.{4}-.{4}-0000-0000000FF1CE}") {
          $buildType = "32-Bit" 
       }

       if ($modifyPath) {
           if ($modifyPath.ToLower().Contains("platform=x86")) {
              $buildType = "32-Bit"
           }

           if ($modifyPath.ToLower().Contains("platform=x64")) {
              $buildType = "64-Bit"
           }
       }

       $primaryOfficeProduct = $false
       $officeProduct = $false
       foreach ($officeInstallPath in $PathList) {
         if ($officeInstallPath) {
            try{
            $installReg = "^" + $installPath.Replace('\', '\\')
            $installReg = $installReg.Replace('(', '\(')
            $installReg = $installReg.Replace(')', '\)')
            if ($officeInstallPath -match $installReg) { $officeProduct = $true }
            } catch {}
         }
       }

       if (!$officeProduct) { continue };

       $name = $regProv.GetStringValue($HKLM, $path, "DisplayName").sValue          

       $primaryOfficeProduct = $true
       if ($ConfigItemList.Contains($key.ToUpper()) -and $name.ToUpper().Contains("MICROSOFT OFFICE")) {
          foreach($exception in $MSexceptionList){
             if($name.ToLower() -match $exception.ToLower()){
                $primaryOfficeProduct = $false
             }
          }
       } else {
          $primaryOfficeProduct = $false
       }

       $clickToRunComponent = $regProv.GetDWORDValue($HKLM, $path, "ClickToRunComponent").uValue
       $uninstallString = $regProv.GetStringValue($HKLM, $path, "UninstallString").sValue
       if (!($clickToRunComponent)) {
          if ($uninstallString) {
             if ($uninstallString.Contains("OfficeClickToRun")) {
                 $clickToRunComponent = $true
             }
          }
       }

       $modifyPath = $regProv.GetStringValue($HKLM, $path, "ModifyPath").sValue 
       $version = $regProv.GetStringValue($HKLM, $path, "DisplayVersion").sValue

       $cltrUpdatedEnabled = $NULL
       $cltrUpdateUrl = $NULL
       $clientCulture = $NULL;

       [string]$clickToRun = $false

       if ($clickToRunComponent) {
           $clickToRun = $true
           if ($name.ToUpper().Contains("MICROSOFT OFFICE")) {
              $primaryOfficeProduct = $true
           }

           foreach ($cltr in $ClickToRunList) {
             if ($cltr.InstallPath) {
               if ($cltr.InstallPath.ToUpper() -eq $installPath.ToUpper()) {
                   $cltrUpdatedEnabled = $cltr.UpdatesEnabled
                   $cltrUpdateUrl = $cltr.UpdateUrl
                   if ($cltr.Platform -eq 'x64') {
                       $buildType = "64-Bit" 
                   }
                   if ($cltr.Platform -eq 'x86') {
                       $buildType = "32-Bit" 
                   }
                   $clientCulture = $cltr.ClientCulture
               }
             }
           }
       }

       if (!$primaryOfficeProduct) {
          if (!$ShowAllInstalledProducts) {
              continue
          }
       }

       $object = New-Object PSObject -Property @{DisplayName = $name; Version = $version; InstallPath = $installPath; ClickToRun = $clickToRun; 
                 Bitness=$buildType; ComputerName=$Server; ClickToRunUpdatesEnabled=$cltrUpdatedEnabled; ClickToRunUpdateUrl=$cltrUpdateUrl;
                 ClientCulture=$clientCulture }
       $object | Add-Member MemberSet PSStandardMembers $PSStandardMembers
       $results += $object

    }
}
$results = Get-Unique -InputObject $results 
if ($results -notmatch "Microsoft*"){
Write-host "none"
}else{
 $results}
powershell-3.0
asked on Stack Overflow Sep 25, 2018 by LSFreak

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0