目标:
在 powershell中编辑特定用户的特定注册表项设置,而不编辑其他用户。
已知:
操作系统:Windows 8.1 Embedded Industry Pro(与Win 8.1相同,但具有一些嵌入式功能)
我可以在目标机器上手动执行此操作,方法是打开REGEDIT,选择HKU,然后单击File Menu,单击Load Hive,导航到用户的配置文件目录,例如:c:\ users \ MrEd和出现提示时,输入' ntuser.dat' - 导入HKEY_CURRENT_USER。 Hive将被装载到HKU,您可以在那里导航并进行必要的修改。
要点:
我有一个powershell脚本,它返回特定用户的SID,但是当在注册表配置单元的上下文中使用时,找不到配置单元"" - 所以我猜我一定错过了一步?如何加载Hive"来自Powershell?或者我在某个地方错过了一个特殊的,神奇的,山羊 - 内脏 - 键盘上的咒语?
Param(
[string]$user= $null
)
Function GetSIDfromAcctName()
{
Param(
[Parameter(mandatory=$true)]$userName
)
$myacct = Get-WmiObject Win32_UserAccount -filter "Name='$userName'"
return $myacct.sid
}
if($user)
{
$sid = GetSIDfromAcctName $user
New-PSDrive HKU Registry HKEY_USERS
$myHiveEntry = Get-Item "HKU:\${sid}"
Write-Host "Key:[$myHiveEntry]"
}
答案 0 :(得分:2)
您现有的代码应该适用于已经加载了配置单元的用户(如当前登录的用户),但它不会尝试加载配置单元。
我不知道如何通过编程方式调用加载配置单元,但您可以向reg.exe
发送邮件。
这最终变得有点像janky。如果它在任何地方使用,似乎有卸载的问题,所以我在这个示例中放了一堆废话试图摆脱可能的东西保持打开,但在我的测试中,reg unload
命令成功之前可能需要一段时间,因此finally块中的整个重试部分。
这是超级未经修饰的,我只是当场鞭打它。
Function GetSIDfromAcctName()
{
Param(
[Parameter(mandatory=$true)]$userName
)
$myacct = Get-WmiObject Win32_UserAccount -filter "Name='$userName'"
return $myacct.sid
}
$user = 'someuser'
$sid = GetSIDfromAcctName -userName $user
$path = Resolve-Path "$env:USERPROFILE\..\$user\NTUSER.DAT"
try {
reg load "HKU\$sid" $path
#New-PSDrive -Name HKUser -PSProvider Registry -Root "HKEY_USERS\$sid"
#Get-ChildItem HKUser:\
Get-ChildItem Registry::\HKEY_USERS\$sid
} finally {
#Remove-PSDrive -Name HKUser
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
$retryCount = 0
$retryLimit = 20
$retryTime = 1 #seconds
reg unload "HKU\$sid" #> $null
while ($LASTEXITCODE -ne 0 -and $retryCount -lt $retryLimit) {
Write-Verbose "Error unloading 'HKU\$sid', waiting and trying again." -Verbose
Start-Sleep -Seconds $retryTime
$retryCount++
reg unload "HKU\$sid"
}
}
这并没有使用PS驱动器,但该代码也在那里,注释掉了。
请注意,如果您没有使用SID为hive挂载点命名,那么您实际上根本不需要SID,因为您仍然使用用户名来查找NTUSER.DAT
文件。 / p>