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

时间:2016-12-26 20:20:33

标签: windows powershell registry powershell-v3.0 powershell-v4.0

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

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:3)

使用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
    }
}

答案 1 :(得分:0)

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

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

通配符将自动检查所有可用路径并返回您需要的内容以及来自父路径的 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

获取用户名很丑;可能有一种更清洁的方法来获得它,但这就是我的想法。双选真的让我的皮肤爬行 - 它有一些不愉快的地方。我可以只做一个一次性的事情,但是它变得如此笨拙,你甚至不知道你在做什么看着它。 我在下面提供了注册表的屏幕截图,以及运行几行的屏幕输出的屏幕截图。

redacted view of the registry for one user

redacted screen output of running the above; mind the line breaks