Red*_*gum 5 windows powershell registrykey
目标:
在Powershell中为特定用户而不是其他用户编辑特定注册表项设置。
已知:
操作系统:Windows 8.1 Embedded Industry Pro(与Win 8.1相同,但具有一些嵌入式功能)
我可以在目标计算机上手动完成此操作,方法是打开REGEDIT,选择HKU,然后单击“文件”菜单,再单击“加载Hive”,导航到用户的配置文件目录,例如:c:\ users \ MrEd,并在出现提示时键入“ ntuser” .dat'-导入HKEY_CURRENT_USER。Hive将被加载到HKU中,您可以在其中导航并进行必要的修改。
摘要:
我有一个Powershell脚本,该脚本返回特定用户的SID,但是在注册表配置单元的上下文中使用时,配置单元“未找到”-因此,我想我必须缺少一个步骤吗?如何从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]"
}
Run Code Online (Sandbox Code Playgroud)
您的现有代码应该适用于已加载配置单元的用户(例如当前登录的用户),但它不会尝试加载配置单元。
我不知道如何进行编程调用来加载配置单元,但您可以使用reg.exe.
这最终变得有点糟糕。如果蜂巢在任何地方使用,那么卸载蜂巢似乎会出现问题,因此我在此示例中放置了一堆垃圾,以尝试摆脱可能使其保持打开状态的东西,但在我的测试中,它可能需要命令成功之前需要很长一段时间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"
}
}
Run Code Online (Sandbox Code Playgroud)
这不使用 PS 驱动器,但该代码也在那里,已注释掉。
请注意,如果您不使用 SID 命名 hive 挂载点,则实际上根本不需要 SID,因为NTUSER.DAT无论如何您都使用用户名来查找文件。