如何在powershell中更改另一个用户的特定注册表设置

时间:2015-08-13 22:45:30

标签: windows powershell registrykey

目标:

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]"
}

1 个答案:

答案 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>