Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 无法正确获取属性和对象结构_.net_Powershell_Object_Properties_Remote Registry - Fatal编程技术网

.net 无法正确获取属性和对象结构

.net 无法正确获取属性和对象结构,.net,powershell,object,properties,remote-registry,.net,Powershell,Object,Properties,Remote Registry,我正在尝试创建一个属性与下面代码相同的对象。以下代码位创建了$TempValueICM对象,并添加了2个NoteProperties: $TempValueICM = Invoke-Command -ComputerName $computer -ScriptBlock { $AppPull = Get-ItemProperty HKLM:\software\Microsoft\Windows\CurrentVersion\Uninstall\* |

我正在尝试创建一个属性与下面代码相同的对象。以下代码位创建了$TempValueICM对象,并添加了2个NoteProperties:

$TempValueICM = Invoke-Command -ComputerName $computer -ScriptBlock {
                $AppPull = Get-ItemProperty HKLM:\software\Microsoft\Windows\CurrentVersion\Uninstall\* |
                    Select-Object DisplayName, DisplayVersion}
它将$TELTVALUEICM创建为一个数组对象,其NoteProperties为DisplayName和Display version,如下所示:

显示版本:4.92.12.0

显示名称:Conexant 20561 SmartAudio HD

显示版本:

显示名称:连接管理器

显示版本:

显示名称:鼠标套件98

我尝试使用.NET pull和以下代码提取相同的数据:

$Hive = [Microsoft.Win32.RegistryHive]::LocalMachine
$AppAddressMain = "software\Microsoft\Windows\CurrentVersion\Uninstall\"
$AppAddressWOW = "software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"



Function Get-InstalledApps {
    param ($MainHive, $Computer, [string[]]$RegAddress)

    Foreach($Address in $RegAddress) {
        $RegBaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($MainHive, $computer)
        $RegSubKey= $RegBaseKey.OpenSubKey($Address)
        foreach($Subkey in $RegSubKey.GetSubKeyNames()){
            $AppAddress = $Address + $Subkey

            $DisplayName = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayName")
            $DisplayVersion = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayVersion")
            Write-Output  @{
                DisplayName = $DisplayName
                DisplayVersion = $DisplayVersion
                }
             }
        }
这将生成一个哈希表数据,我可以通过点表示法(例如-“$TempValue.DisplayName”)获取一些信息并访问它,但当查看对象时,它仅显示“键”和“值”作为$TempValue对象的对象属性,而不是我希望的属性名称(例如,-DisplayName和DisplayVersion).

我尝试在函数中创建一个临时变量,将数据作为属性保存,例如-

 $Temp = "" | select DisplayName, DisplayVersion
     $Temp.DisplayName += ,$DisplayName
     $Temp.Publisher += ,$Publisher
     $Temp.DisplayVersion += ,$DisplayVersion
但那不行

具体地说,我最终将不得不对对象进行排序—对其进行属性排序,并且需要两个函数的逻辑相同(即,数据可以来自相同格式的任一“逻辑”,以便以相同的方式进行处理)


如何对对象进行格式化,以便以与上面$TempValueICM相同的方式提供相同的信息(即-如何获取哈希表中的项以填充对象的属性)?谢谢,

以下内容似乎可以工作,尽管看起来有点笨拙:

$Hive = [Microsoft.Win32.RegistryHive]::LocalMachine
$AppAddressMain = "software\Microsoft\Windows\CurrentVersion\Uninstall\"
$AppAddressWOW = "software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"

Function Get-InstalledApps
{
    param ($MainHive,
        $Computer,
        [string[]]$RegAddress)

    Foreach ($Address in $RegAddress)
    {
        $RegBaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($MainHive, $computer)
        $RegSubKey = $RegBaseKey.OpenSubKey($Address)
        $output = @()
        foreach ($Subkey in $RegSubKey.GetSubKeyNames())
        {
            $AppAddress = $Address + $Subkey
            $DisplayName = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayName")
            $DisplayVersion = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayVersion")
            $output += [PSCustomObject]@{ DisplayName = $DisplayName; DisplayVersion = $DisplayVersion }
        }
    }
    return $output
}

Get-InstalledApps -MainHive $Hive -Computer "MyPC" -RegAddress $AppAddressMain | sort DisplayName
 Function Get-InstalledApps {
    param ($MainHive, $Computer, [string[]]$RegAddress)

    Foreach($Address in $RegAddress) {
        $RegBaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($MainHive, $computer)
        $RegSubKey= $RegBaseKey.OpenSubKey($Address)
        $ReturnTotal = foreach($Subkey in $RegSubKey.GetSubKeyNames()){
            $ReturnInd = "" | Select-Object DisplayName, DisplayVersion
            $AppAddress = $Address + $Subkey
            $DisplayName = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayName")
            $DisplayVersion = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayVersion")

            $ReturnInd.DisplayName = $DisplayName
            $ReturnInd.DisplayVersion = $DisplayVersion
            Write-Output $Return
        }
        Write-Output $ReturnTotal
    }
} 
本质上,我添加了一个单独的变量($ReturnInd)来收集每个子键运行的每个pull。然后我创建了另一个变量来包含foreach子键循环的整个结果($ReturnTotal),然后将其写入输出

结果与另一个方法不完全相同-第一个方法生成“反序列化的、选定的、系统的、管理的、自动化的、PSCustomObject” 尽管这会生成一个“Selected.System.String”,但它们都具有我需要的属性

我可以使用以下命令对两者进行排序:

$TempValue | Sort-Object -Property DisplayName

如果有人能找到更好的方法(或更好/更干净/更容易阅读的代码),请执行…

是的,我可以让它工作,它只会给出一个与顶部代码不同的对象。这两个对象最终都是System.Array,但顶部生成的项的属性与“Select”中的项匹配语句,而底部没有(它将“键”和“值”列为属性,而不是“显示名称”。我忘了在上面特别提到,我最终将不得不对对象进行排序-对其进行属性排序,并且需要两个函数的逻辑相同。编辑答案以返回一个对象数组。我希望我正确理解了您的目标。