Powershell-Skript zum Ausführen einer. reg-Datei auf Remotecomputern

Ich habe versucht, eine Batchdatei mit PsExec zu erstellen, um die Registrierungseinstellungen auf Remote-Computern ohne Erfolg zu aktualisieren, daher versuche ich jetzt, Powershell zu verwenden. Ich habe das folgende Skript mithilfe von Google kompiliert und mit Skripten gespielt, die in verschiedenen Foren verfügbar sind.

 $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")
 }
 
 }
 

Jetzt erhalte ich für mein Problem beim Ausführen des Skripts den folgenden Fehler

WinRM ist bereits für den Empfang von Anforderungen auf diesem Computer eingerichtet.

WinRM ist bereits für Remote eingerichtet management auf dieser Maschine.

Copy-item: Pfad kann nicht gefunden werden 'C:\OfficeDocumentfix.reg ' weil es nicht existiert.

Aber der Pfad ist korrekt, ist etwas offensichtlich falsch mit dem Skript, das ich verwende, das ist mein 2. Push in Powershell, also wäre jede Hilfe dankbar

Author: Community, 2016-05-31

2 answers

WinRM ist bereits für den Empfang von Anfragen auf diesem Computer eingerichtet.

WinRM ist bereits für die Fernverwaltung auf diesem Computer eingerichtet.

Löschen Sie dieses winrm quickconfig aus Ihrem Skript. es möchte Ihren WinRM-Dienst konfigurieren, ist aber bereits eingerichtet, sodass dies nicht erforderlich ist. WinRM können Sie Remote-Computer über seinen Dienst zugreifen, es ist für zB invoke-command {} benötigt.

Copy-item: Pfad kann nicht gefunden werden 'C:\OfficeDocumentfix.reg', weil es nicht vorhanden.

Der Grund dafür ist, dass Ihre $newfile Variable $servers anstelle von $server verwendet, wie es sollte (weil es innerhalb des foreach() Blocks ist), also $servers ist $null. das ist die Ursache des Fehlers.

Wenn die Registrierungsdatei, die Sie verwenden, in HKCU: schreibt, müssen Sie das Skript nicht erhöhen, wenn es in HKLM schreibt: müssen Sie. Nur Admins können in HKLM schreiben. Die Höhe ist der ganze Teil von Anfang an bis zu winrm quickconfig.

Dies sollte Ihnen Folgendes geben endprodukt (ich habe die Höhe dort gelassen):

$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..."
    }
}

Bitte schauen Sie sich auch diese Zeile an:

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

Es ist noch nicht dynamisch. es wird immer test.reg anstelle der gewünschten Reg-Datei eingelesen.

Anstelle von start-process können Sie auch einfach regedit /s $regfile /f PowerShell kann Batch - ähnliche Befehle ausführen (aber das ist Detail. wenn es so funktioniert, lass es so wie es ist).

 4
Author: SimonS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-05-31 14:05:12

Ich ziehe es vor, mich nicht mit Double Hop und anderen Authentifizierungsproblemen zu beschäftigen und den Inhalt der Registrierungsdatei als Parameter an Invoke-Command zu übergeben. Dies bietet gewisse Vorteile gegenüber dem Remote-Server, der versucht, eine Dateifreigabe zu erreichen, die versucht, eine Datei abzurufen, und kann sogar von Computern aus domänenübergreifend ausgeführt werden.

$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
 2
Author: Gregory Suvalian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-07-12 14:34:03