Powershell: удаленное изменение ветки реестра HKEY_USERS

Для решения данной задачи будем использовать, как маппинг ветки реестра на локальную машину, в данном случае файл находящийся в каталоге пользователя: C:\Users\<username>\ntuser.dat, так и Invoke-Command.

В случае, если на удаленной машине есть активные процессы под пользователем, ветку которого мы хотим загрузить командой reg load <куда> <от куда>, то произойдет исключение и скрипт перейдет в исполнение инструкций из блока Catch в которой указана команда Invoke-Command. Если же процессов нет, то выполняются инструкции из Try.

Пример: reg load HKLM\TempHive \\$remote_server\C$\Users\$user\ntuser.dat

После чего можно уже выполнить определенные действия с подключенной веткой и отвязать ее с помощью команды reg unload <путь к ветке>

Если же вы не отвяжете ветку, то пользователь сможет войти только с временным профилем.

Скрипт тестировался на серверах с Windows Server 2019 и Windows Server 2012 R2

<#  
    This is script add values HKU regedit for active and unactive users
#>

$ErrorActionPreference = "Stop"
$pathreg = "TempHive\Software\Business Objects\Suite 11.5\Crystal Reports\Export\Pdf"

$user = "TestUser"

$regtype = "dword"
$regvalue = "00000001"

$remote_server = "rds2"

#Variables script block for remote startup
$scriptblock = {
            param($login, $regtype1, $regvalue1)
            
            #Add-Content -Path "c:\temp\qwer.log"`
            #-Value "[$((Get-Date).TimeOfDay)] Login =$login, regtype = $regtype1, Regvalue = $regvalue1 "

            function get-sid
                {
                    Param ( $DSIdentity )
                    $ID = new-object System.Security.Principal.NTAccount($DSIdentity)
                    return $ID.Translate( [System.Security.Principal.SecurityIdentifier] ).toString()
                }
            $admin = get-sid $login
            $sid=$admin.SubString(0, $admin.Length)
            $pathreg2 = $sid+"\Software\Business Objects\Suite 11.5\Crystal Reports\Export\Pdf"

            if (Test-Path -Path Registry::HKEY_USERS\$pathreg2)
               {
                    if (!(Get-ItemProperty -Path Registry::HKEY_USERS\$pathreg2 -name "ForceLargerFonts" -ErrorAction SilentlyContinue))
                        { 
                            New-ItemProperty -Path Registry::HKEY_USERS\$pathreg2 -Name "ForceLargerFonts" -PropertyType $regtype1 -Value $regvalue1 
                        }
                    else{
                           Set-ItemProperty -Path Registry::HKEY_USERS\$pathreg2 -Name "ForceLargerFonts" -Value $regvalue1  -Force
                        }
               }
            else
                {
                    New-Item -Path Registry::HKEY_USERS\$pathreg2 -Force | Out-Null
                    New-ItemProperty -Path Registry::HKEY_USERS\$pathreg2 -Name "ForceLargerFonts" -PropertyType $regtype1 -Value $regvalue1
                }
            }
#end scriptblock


if (Test-Path -Path Registry::HKEY_LOCAL_MACHINE\$pathreg) 
 {reg unload HKLM\TempHive}

try
{   #if the user session is not active on the remote server and all processes are stopped
    #upload the remote HKEY_USERS branch of the registry to the local server
    reg load HKLM\TempHive \\$remote_server\C$\Users\$user\ntuser.dat
    if (Test-Path -Path Registry::HKEY_LOCAL_MACHINE\$pathreg)
   {
        if (!(Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\$pathreg -name "ForceLargerFonts" -ErrorAction SilentlyContinue))
            {
                New-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\$pathreg -Name "ForceLargerFonts" -PropertyType $regtype -Value $regvalue
            }
        else{
                Set-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\$pathreg -Name "ForceLargerFonts" -Value $regvalue -Force
            }
   }  
else
   {
        New-Item -Path Registry::HKEY_LOCAL_MACHINE\$pathreg -Force | Out-Null
        New-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\$pathreg -Name "ForceLargerFonts" -PropertyType $regtype -Value $regvalue
   }
    reg unload HKLM\TempHive 
}
catch{
    #remote start script if user session is active on remote server or some process is running
    Invoke-Command -ComputerName $remote_server -ScriptBlock $scriptblock -ArgumentList ($user,$regtype,$regvalue)
}
finally{
    if (Test-Path -Path Registry::HKEY_LOCAL_MACHINE\$pathreg) 
      {reg unload HKLM\TempHive}
}


#garbage collector
[gc]::collect()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *