2015-08-13 86 views
3

目標:如何更改特定的註冊表設置,其他用戶在PowerShell中

要編輯特定用戶的特定註冊表項設置,並沒有其他人,在PowerShell中。

已知:

操作系統:Windows 8.1嵌入式行業專業(同贏8.1,但也有一些嵌入功能)

我可以手動在目標機器上打開註冊表編輯器做到這一點,選擇HKU,然後點擊文件菜單,點擊加載配置單元,導航到用戶的配置文件目錄,例如:c:\ users \ MrEd,當系統提示時,鍵入'ntuser.dat' - 導入HKEY_CURRENT_USER。 Hive將被加載到香港大學,您可以瀏覽並進行必要的修改。

摘要:

我有一個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]" 
} 
+0

對我來說確定,確保你使用HKU的dir $ myHiveEntry:Location,否則它會拋出錯誤,在訪問它之前添加「CD HKU:」 – Avshalom

回答

1

您現有的代碼應該適用於其配置單元已經加載的用戶(如當前登錄的用戶),但它不會嘗試加載配置單元。

我不知道如何編程調用來加載配置單元,但您可以將其設置爲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" 
    } 
} 

這不使用PS驅動器,但該代碼也在那裏,註釋掉。

請注意,如果您沒有用SID命名Hive掛載點,則根本不需要SID,因爲您仍然使用用戶名來查找NTUSER.DAT文件。

+0

嗨Briantist - 這讓我走得更遠。我確實注意到,即使在使用Regedit手動執行此操作後,它仍然喜歡在關閉時保留NTUSER.DAT文件。幸運的是,這是註定要成爲部署前腳本的一部分,因此係統在這個和其他小型玩家被實現後重新啓動。感謝您的幫助! – Redgum

相關問題