如何使用 powershell 以编程方式查找用户 HKEY_USERS 注册表项?

Posted

技术标签:

【中文标题】如何使用 powershell 以编程方式查找用户 HKEY_USERS 注册表项?【英文标题】:How can I programmatically find a users HKEY_USERS registry key using powershell? 【发布时间】:2012-06-10 03:28:36 【问题描述】:

如果您知道本地计算机上该用户的登录名,我想知道是否有办法在 HKEY_USERS 中找到本地用户的注册表项。我想以编程方式将内容添加到特定用户的注册表项(例如 Autorun),但我只知道用户名。如何确定 HKEY_USERS 中的哪些神秘用户实际上属于特定用户名?

【问题讨论】:

【参考方案1】:
$User = New-Object System.Security.Principal.NTAccount($env:UserName)
$sid = $User.Translate([System.Security.Principal.SecurityIdentifier]).value

上面的 sn-p 给你登录用户的 SID。当附加到 HKEY_USERS 时,这将为您提供该用户名的正确路径。

New-PSDrive HKU Registry HKEY_USERS
Get-Item "HKU:\$sid"

【讨论】:

好的,您知道如何以编程方式 (PowerShell) 加载用户配置单元,就像可以使用 regedit.exe 一样? U 的意思类似于 reg.exe LOAD 选项? @JPBlanc 看起来 .NET 和随后的 PowerShell 不支持这样做。您必须使用 RegLoadKey() P/Invoke Windows API。看看这个 - csharphelp.com/2007/01/registry-ins-and-outs-using-c 感谢@Andy Arismendi,这是我的怀疑。 嗨,非常感谢您的回答,但是,我可以按照您描述的方式找到其他用户的 SID,但是当我打开 regedit.exe 时,我得到了一个看不到的 SID。所以问题是我如何最终添加或更改该用户路径的键?是否必须以某种方式显式加载,如果是,如何实现?【参考方案2】:

此答案不完整,因为 HKEY_USERS 不包含所有用户,仅包含当前活跃的用户。

您需要为要使用的用户加载注册表配置单元

reg load hku\ThatUserName C:\Users\ThatUserName\NTUSER.DAT

请参阅this SO answer,了解如何为所有用户加载注册表配置单元的示例。

然后您可以使用以下命令访问该用户的注册表

Set-Location HKU:\ThatUserName

或者调用 New-PSDrive 给用户的注册表它自己的驱动器,像这样:

New-PSDrive -Name HKThatUser -PSProvider Registry -Root HKU\ThatUserName 
Set-Location HKThatUser:

一定要卸载注册表,并进行垃圾收集以确保在完成后释放配置单元:

reg unload hku\ThatUserName
[gc]::collect()

见this post for more info

【讨论】:

确保释放 hive 的部分很重要。我不得不将订单切换到[gc]::collect() [GC]::WaitForPendingFinalizers() reg unload hku\ThatUserName。否则,我在卸载时收到权限被拒绝错误。如果我不卸载它,则不会保存对注册表的更改。 @absynce 赞成但不幸的是答案不正确,无论是否使用,在调用 reg unload 之前都必须关闭密钥,请参见此处:docs.microsoft.com/en-us/dotnet/api/…【参考方案3】:

这对我有用

ls 'hklm:software/microsoft/windows nt/currentversion/profilelist' | ? 
  $_.getvalue('profileimagepath') -match 'Steven'
 | % pschildname

Example

【讨论】:

以上是关于如何使用 powershell 以编程方式查找用户 HKEY_USERS 注册表项?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更改 PowerShell 控制台字体

如何使用 PowerShell 处理数组以查找特定字符串?

如何从PowerShell以编程方式列出VSTS代理池?

如何使用PowerShell中的当前Windows用户的凭据加密KeePass?

如何以编程方式查找所谓的宏

作为管理员,如何使用 Grails Spring Security 以编程方式更改用户密码?