Как извлечь дочерние ключи реестра из динамического c HKEY_USERS \ SID в reg-файл и заменить SID в reg-файле с помощью Powershell - PullRequest
0 голосов
/ 06 августа 2020

Я пишу сценарий резервного копирования / восстановления для PowerShell, который позволяет пользователям создавать резервные копии и восстанавливать различные настройки до и после установки windows. Один из примеров включает HKEY_USERS\S-1-5-21-3096151585-4241824952-1105149943-1008\SOFTWARE\7 Taskbar Tweaker\Options

Как мне рекурсивно сохранить этот ключ как файл reg, например, с помощью reg export <keyname> <filename> [/y] или другого механизма экспорта, без ручного ввода sid? SID - это динамический c на fre sh установках, поэтому я должен также заменить SID в reg-файле, чтобы обеспечить правильный импорт.

$User = New-Object System.Security.Principal.NTAccount($env:UserName)
$sid = $User.Translate([System.Security.Principal.SecurityIdentifier]).value

Приведенный выше фрагмент дает вам SID зарегистрированного- в пользователе. Это при добавлении к HKEY_USERS дает вам правильный путь для этого имени пользователя.

New-PSDrive HKU Registry HKEY_USERS
Get-Item "HKU:\${sid}"

Это вытягивает sid текущего пользователя;

$content = [System.IO.File]::ReadAllText("c:\temp\test.reg").Replace("anoose","$sid"); [System.IO.File]::WriteAllText("c:\temp\test.reg", $content)

Это заменяет anoose текущим SID, но как мне использовать шаблон регулярного выражения для замены старого SID на текущий пользовательский sid? или ^S-\d-(\d+-){1,14}\d+$ или S-\d-\d-\d+-\d+-\d+-\d+-\w+, ни один из них не работает в моем скрипте; ex, $r = [regex] "/^S-1-[0-59]-\d{2}-\d{10}-\d{10}-\d{8}-[1-9]\d{3}/" ...

«Заменить» пытается заменить сам шаблон регулярного выражения.

1 Ответ

0 голосов
/ 07 августа 2020

Это то, что вы хотите?

#get sid from username
$User = New-Object System.Security.Principal.NTAccount($env:UserName)
$sid = $User.Translate([System.Security.Principal.SecurityIdentifier]).value
#set export filename
$filename = "$env:SystemDrive\Export\$($env:UserName).reg"
#key to export, without HIVE or SID e.g. SOFTWARE\Microsoft\Windows
$key = "SOFTWARE\7 Taskbar Tweaker\Options"
#check whether the user hive is loaded
if (Test-Path "Registry::HKEY_USERS\$sid" -PathType Container) {
    #it is loaded, check the key
    if (Test-Path "Registry::HKEY_USERS\$sid\$key") {
        Write-Output "The specified key was found under: $env:UserName. Exporting..."
        & "$env:windir\system32\reg.exe" "EXPORT `"HKEY_USERS\$sid\$key`" `"$filename`" /y"
    }
    else {
        Write-Output "The specified key does not exist under: $env:UserName"
    }
}
Else {
    #it isnt loaded, load it
    & "$env:windir\system32\reg.exe" "LOAD HKU\TEMP `"$env:SystemDrive\Users\$env:UserName\NTUSER.DAT`""
    #export the key if the key exists
    if (Test-Path "Registry::HKU\TEMP\$key") {
        Write-Output "The specified key was found under: $env:UserName. Exporting..."
        & "$env:windir\system32\reg.exe" "EXPORT `"HKU\TEMP\$key`" `"$filename`" /y"
    }
    else {
        Write-Output "The specified key does not exist under: $env:UserName"
    }
    #unload it
    & "$env:windir\system32\reg.exe" "LOAD HKU\TEMP"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...