在 PowerShell 中,如何从所有 SID 中提取 HKEY_Users 中的文件?

In PowerShell, how can I extract a file from HKEY_Users from all SIDs?

我正在编写一个 PowerShell 模块来查找在某个时候登录计算机的每个用户可能在其 HKEY_USERS 目录中的数据。我最初的想法是挂载 HKEY_USERS,找到一种方法将每个用户的 SID 存储在一个字符串变量中,然后像这样循环遍历所有文件夹:

dir HKU\<STRING VARIABLE HOLDING SID>\Software\MyApp\Mydesireddata

有没有一种方法可以避免循环遍历 SID(因为我不会提前知道它们),并从系统上的每个 SID 中提取该文件信息,同时记住它来自哪个 SID?

编辑:这是我尝试使用 regedit(vncviewer 的 EulaAccepted)从每个用户的 SID 中提取的密钥示例

使用 Get-ChildItem 检索每个用户特定的子项:

$UserHives = Get-ChildItem Registry::HKEY_USERS\ |Where-Object {$_.Name -match '^HKEY_USERS\S-1-5-21-[\d\-]+$'}

然后遍历每个条目并检索所需的注册表值:

foreach($Hive in $UserHives)
{
    # Construct path from base key
    $Path = Join-Path $Hive.PSPath "SOFTWARE\MyApp\DataKey"

    # Attempt to retrieve Item property
    $Item = Get-ItemProperty -Path $Path -Name ValueName -ErrorAction SilentlyContinue

    # Check if item property was there or not    
    if($Item)
    {
        $Item.ValueName
    }
    else 
    {
        # doesn't exist
    }
}

我解决这个问题的方式略有不同;更喜欢使用显眼的通配符。

Get-ItemProperty -Path Registry::HKEY_USERS\*\SOFTWARE\TestVNC\viewer\ -Name EulaAccepted | 
   Select-Object -Property @{n="SID";e={$_.PSPath.Split('::')[-1].Split('\')[1]}},EulaAccepted

通配符将自动检查所有可用路径和return您需要的以及来自父路径的 SID。

至于用户名(这可能比 SID 更有用),你没有特别要求,但我添加它是为了笑话;这应该涵盖本地和域帐户。

注意换行符

Get-ItemProperty -Path Registry::HKEY_USERS\*\SOFTWARE\TestVNC\viewer\ -Name EulaAccepted | 
   Select-Object -Property @{n="SID";e={$_.PSPath.Split('::')[-1].Split('\')[1]}},EulaAccepted | 
   Select-Object -Property @{n="User";e={[System.Security.Principal.SecurityIdentifier]::new($_.SID).`
     Translate([System.Security.Principal.NTAccount]).Value}},SID,EulaAccepted

获取用户名很难看;可能有一种更简洁的方法来获得它,但这就是我的想法。 double-select 真的让我毛骨悚然——这有点令人不快。我本来可以做一个一次性的事情,但它变得如此笨拙,你甚至不知道你在看它在做什么。 我在下面附上了注册表的屏幕截图,以及 运行 几行的屏幕输出屏幕截图。