Powershell สคริปต์เพื่อเรียกใช้ไฟล์. reg บนคอมพิวเตอร์ระยะไกล


2

ฉันได้ลองสร้างไฟล์แบตช์โดยใช้ PsExec เพื่ออัปเดตการตั้งค่ารีจิสตรีบนคอมพิวเตอร์ระยะไกลไม่สำเร็จดังนั้นตอนนี้ฉันพยายามใช้ Powershell ฉันได้รวบรวมสคริปต์ต่อไปนี้โดยใช้ Google และเล่นกับสคริปต์ที่มีอยู่ในฟอรัมต่างๆ

 $myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
 $myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)


 $adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator


 if ($myWindowsPrincipal.IsInRole($adminRole))
    {

    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
    $Host.UI.RawUI.BackgroundColor = "Darkred"
    clear-host
    }
 else
    {


    $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";


    $newProcess.Arguments = $myInvocation.MyCommand.Definition;


    $newProcess.Verb = "runas";


    [System.Diagnostics.Process]::Start($newProcess);


    exit
    }

winrm quickconfig


    $servers = Get-Content c:\temp\servers.txt


    $HostedRegFile = "temp\OfficeDocumentfix.reg"

    foreach ($server in $servers)

    {

    $newfile = "\\$servers\c`$\Downloads\RegistryFiles\"

    New-Item -ErrorAction SilentlyContinue -ItemType directory -Path \\$servers\C$\Downloads\RegistryFiles\

    Copy-Item $HostedRegFile -Destination $newfile

    Invoke-Command -ComputerName $server -ScriptBlock {

    Start-Process -filepath "C:\windows\regedit.exe" -argumentlist "/s C:\Downloads\RegistryFiles\test.reg"



 Write-Host -NoNewLine "Press any key to continue..."
 $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

$returncode = $?+":"+$lastexitcode;

$codearr = $returncode.split(":");

write-host $codearr[0];

write-host $codearr[1];

#echo Registry_updated_successfully

#:Failed
#echo Registry_update_failed

 Write-Host -NoNewLine "Press any key to continue..."
 $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
 }

 }

ตอนนี้สำหรับปัญหาของฉันเรียกใช้สคริปต์ฉันได้รับข้อผิดพลาดดังต่อไปนี้

WinRM ได้รับการตั้งค่าให้รับคำขอบนเครื่องนี้แล้ว

WinRM ได้รับการตั้งค่าสำหรับการจัดการระยะไกลบนเครื่องนี้แล้ว

รายการคัดลอก: ไม่สามารถหาเส้นทาง 'C: \ OfficeDocumentfix.reg' เนื่องจากไม่มีอยู่

แต่เส้นทางนั้นถูกต้องมีบางอย่างผิดปกติอย่างเห็นได้ชัดกับสคริปต์ที่ฉันใช้นี่คือการผลักดันครั้งที่สองของฉันใน Powershell ดังนั้นความช่วยเหลือใด ๆ จะได้รับการชื่นชม


โปรดแก้ไขคำถามของคุณและแสดงการPsExecโทร
JosefZ

คำตอบ:


4

WinRM ได้รับการตั้งค่าให้รับคำขอบนเครื่องนี้แล้ว

WinRM ได้รับการตั้งค่าสำหรับการจัดการระยะไกลบนเครื่องนี้แล้ว

ลบสิ่งนี้winrm quickconfigออกจากสคริปต์ของคุณ มันต้องการกำหนดค่าบริการ WinRM ของคุณ แต่ได้ตั้งค่าไว้แล้วจึงไม่จำเป็นต้องทำสิ่งนี้ WinRM invoke-command {}ช่วยให้คุณเข้าถึงคอมพิวเตอร์ระยะไกลผ่านทางบริการของมันก็จำเป็นสำหรับเช่น

รายการคัดลอก: ไม่สามารถหาเส้นทาง 'C: \ OfficeDocumentfix.reg' เนื่องจากไม่มีอยู่

เหตุผลนี้ก็คือว่าคุณ$newfileตัวแปรใช้$serversแทน$serverเท่าที่ควร (เพราะมันเป็นเรื่องภายในforeach()บล็อก) เพื่อให้เป็น$servers $nullนั่นเป็นสาเหตุของข้อผิดพลาด

หากไฟล์ Registry ที่คุณใช้เขียนไปยัง HKCU: คุณไม่จำเป็นต้องยกระดับสคริปต์หากไฟล์นั้นกำลังเขียนไปที่ HKLM: คุณต้องทำ ผู้ดูแลระบบเท่านั้นที่สามารถเขียนถึง HKLM winrm quickconfigที่ระดับความสูงเป็นส่วนทั้งจากจุดเริ่มต้นขึ้นไป

นี่ควรให้ผลลัพธ์สุดท้ายแก่คุณ (ฉันออกจากระดับความสูงในนั้น):

$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)

$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator

if ($myWindowsPrincipal.IsInRole($adminRole))
{
    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
    $Host.UI.RawUI.BackgroundColor = "Darkred"
    clear-host
}
else
{
    $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";
    $newProcess.Arguments = $myInvocation.MyCommand.Definition;
    $newProcess.Verb = "runas";
    [System.Diagnostics.Process]::Start($newProcess);
    exit
}

$servers = Get-Content c:\temp\servers.txt

$HostedRegFile = "C:\temp\CyclopsOfficeDocumentfix.reg"
foreach ($server in $servers)
{
    $newfile = "\\$server\c`$\Downloads\RegistryFiles\"
    New-Item -ErrorAction SilentlyContinue -ItemType directory -Path \\$server\C$\Downloads\RegistryFiles\
    Copy-Item $HostedRegFile -Destination $newfile
    Invoke-Command -ComputerName $server -ScriptBlock {
        Start-Process -filepath "C:\windows\regedit.exe" -argumentlist "/s C:\Downloads\RegistryFiles\test.reg"
        Write-Host -NoNewLine "Press any key to continue..."
    }
}

โปรดดูบรรทัดนี้ด้วย:

Start-Process -filepath "C:\windows\regedit.exe" -argumentlist "/s C:\Downloads\RegistryFiles\test.reg"

มันยังไม่ไดนามิค มันจะอ่านtest.regแทนไฟล์ reg ที่คุณต้องการ

แทนที่จะเป็นstart-processคุณก็สามารถใช้regedit /s $regfile /fPowerShell สามารถดำเนินการคำสั่งแบบแบทช์ (แต่นั่นคือรายละเอียดถ้ามันใช้งานได้แบบนี้ปล่อยให้มันเหมือนเดิม)


2

ฉันไม่ต้องการยุ่งกับคู่ hop และปัญหาการตรวจสอบอื่น ๆ และผ่านเนื้อหาของไฟล์รีจิสทรี paramater Invoke-Commandไป นี่เป็นข้อได้เปรียบบางประการที่ทำให้เซิร์ฟเวอร์ระยะไกลพยายามเข้าถึงไฟล์บางไฟล์ร่วมกันบางแห่งที่พยายามดึงไฟล์และสามารถทำงานได้แม้กระทั่งจากคอมพิวเตอร์ที่มีโดเมนตรงกัน

$regFile = @"
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"MaxUserPort"=dword:00005000
"TcpTimedWaitDelay"=dword:0000001e
"@

Invoke-Command -ComputerName comp -ScriptBlock {param($regFile) $regFile | out-file $env:temp\a.reg; 
    reg.exe import $env:temp\a.reg } -ArgumentList $regFile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.