2013-02-25 6 views
15

Ich habe das folgende Skript, das ich möchte es auf mehrere Server ausgehen und den Wert einer Registrierung erhalten. Leider gibt es derzeit nur den lokalen Registrierungswert des Computers zurück, auf dem das Skript ausgeführt wird.Get remote Registrierungswert

Wie bekomme ich das Skript gegen Remote-Registrierung ausgeführt werden?

SCRIPT:

clear 
#$ErrorActionPreference = "silentlycontinue" 

$Logfile = "C:\temp\NEWnetbackup_version.log" 

Function LogWrite 
{ 
    param([string]$logstring) 

    Add-Content $Logfile -Value $logstring 
} 

$computer = Get-Content -Path c:\temp\netbackup_servers1.txt 

foreach ($computer1 in $computer){ 

$Service = Get-WmiObject Win32_Service -Filter "Name = 'NetBackup Client Service'" -ComputerName $computer1 

    if (test-connection $computer1 -quiet) 
    { 
      $NetbackupVersion1 = $(Get-ItemProperty hklm:\SOFTWARE\Veritas\NetBackup\CurrentVersion).PackageVersion 

      if($Service.state -eq 'Running') 
      { 
       LogWrite "$computer1 STARTED $NetbackupVersion1" 
      } 
      else 
      { 
       LogWrite "$computer1 STOPPED $NetbackupVersion1" 
      } 
    } 
    else 
    { 
     LogWrite "$computer1 is down" -foregroundcolor RED 
    } 
} 

Antwort

31

Sie versuchen, .net verwenden können:

$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $computer1) 
$RegKey= $Reg.OpenSubKey("SOFTWARE\\Veritas\\NetBackup\\CurrentVersion") 
$NetbackupVersion1 = $RegKey.GetValue("PackageVersion") 
+0

Dank - das funktioniert; Wie integriere ich das in den LogWrite, damit der Wert in die Logdatei, die ich habe, ausgegeben werden soll? – lara400

+1

@ lara400 Wie Sie in Ihrem Code tun: 'LogWrite" $ computer1 STARTED $ NetbackupVersion1 "'. Aber vielleicht habe ich deine Frage nicht verstanden ... –

+0

Vielen Dank - deine eine hat es geschafft ...... genauso wie Shay's! – lara400

4

Wenn Sie Powershell-Remoting und CredSSP-Setup haben, dann können Sie Ihren Code auf das folgende Update:

$Session = New-PSSession -ComputerName $Computer1 -Authentication CredSSP 
$NetbackupVersion1 = Invoke-Command -Session $Session -ScriptBlock { $(Get-ItemProperty hklm:\SOFTWARE\Veritas\NetBackup\CurrentVersion).PackageVersion} 
Remove-PSSession $Session 
+0

Wenn Sie Remoting durchführen und keine Module von Drittanbietern verwenden möchten, verwenden Sie diese Option. Es ist viel einfacher zu lesen als direkte Methodenaufrufe. Ist CredSSP eine Double-Hop-Sache? Ich brauchte es dafür nicht. Vielen Dank! –

12

Versuchen Sie die Remote Registry Module, der Registrierungsanbieter kann nicht remote ausgeführt werden:

Import-Module PSRemoteRegistry 
Get-RegValue -ComputerName $Computer1 -Key SOFTWARE\Veritas\NetBackup\CurrentVersion -Value PackageVersion 
+0

oh ich wusste nicht, dass das existiert! – jbockle

+0

@shaylevy Du hast einen tollen Job mit diesem Modul gemacht! –

+2

fantastisch - genau das, was ich brauchte - danke dafür - hat perfekt funktioniert. – lara400

2

Für die Remote-Registrierung Sie .NET mit Powershell 2,0

$w32reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$computer1) 
$keypath = 'SOFTWARE\Veritas\NetBackup\CurrentVersion' 
$netbackup = $w32reg.OpenSubKey($keypath) 
$NetbackupVersion1 = $netbackup.GetValue('PackageVersion') 
+1

danke dafür - scheint C.B's ähnlich zu sein und das hat funktioniert. – lara400

2

verwenden Wenn Sie Benutzer-SID und durchsuchen Remote HKEY_USERS Ordner benötigen, können Sie dieses Skript folgen:

<# Replace following domain.name with yours and userAccountName with remote username #> 
$userLogin = New-Object System.Security.Principal.NTAccount(“domain.name“,”userAccountName“) 
$userSID = $userLogin.Translate([System.Security.Principal.SecurityIdentifier]) 

<# We will open HKEY_USERS and with accurate user’s SID from remoteComputer #> 
$remoteRegistry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘Users’,”remoteComputer“) 

<# We will then retrieve LocalName value from Control Panel/International subkeys #> 

$key = $userSID.value+”\Control Panel\International” 
$openKey = $remoteRegistry.OpenSubKey($key) 

<# We can now retrieve any values #> 

$localName = $openKey.GetValue(‘LocaleName’) 

Quelle: http://techsultan.com/how-to-browse-remote-registry-in-powershell/

-2

Verwenden von Python und WMI-Modul.

import wmi 

conn = wmi.WMI('172.20.58.34', user='UserName', password='Password') 
command = r'cmd /c reg query "HKLM\SOFTWARE\Microsoft" /ve > C:\output.txt' 
conn.Win32_Process.Create(CommandLine=command) 

Weitere Informationen $ reg /? an der Eingabeaufforderung.

+0

Leute, die das zum Negativen ablehnen, sollten eine Erklärung liefern, warum sie vorschlagen, dass dies keine gute Antwort ist. So kann sich jeder verbessern. – Carol

0

eine weitere Option ... braucht ... Remoting

(invoke-command -ComputerName mymachine -ScriptBlock {Get-ItemProperty HKLM:\SOFTWARE\VanDyke\VShell\License -Name Version }).version 
Verwandte Themen