如何在Powershell中为其他用户更改特定的注册表设置

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)

bri*_*ist 4

您的现有代码应该适用于已加载配置单元的用户(例如当前登录的用户),但它不会尝试加载配置单元。

我不知道如何进行编程调用来加载配置单元,但您可以使用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无论如何您都使用用户名来查找文件。