2016-08-09 190 views
0

Ich lerne, neue Objekte zu erstellen und Eigenschaften von anderen Objekten zu kombinieren. In diesem Skript möchte ich herausfinden, was die PS-Version ist und auch einige andere Eigenschaften wie OS, IP usw. hinzufügen ... aber ich laufe auf 2 Probleme. Wir haben 6 Domains und ich kann nicht scheinen über jede Domain zu iterieren. Ich versuchte (Get-ADForest).Domains und kann die Liste der Domänen sehen. Es gibt immer noch nur Objekte in der Domäne zurück, zu der meine Arbeitsstation gehört. Das zweite Problem ist die Invoke-Command. Die Version gibt immer 5. Ich weiß, dass viele der Server zurückgegeben werden nicht über PSVersion 5.Mitglieder anderer Domänen und PS-Version können nicht abgerufen werden

function Get-PSVersion { 
    (Invoke-Command -Scriptblock {$PSVersionTable.PSVersion}) | Select Major 
} 

$servers = Get-ADComputer -Filter {(enabled -eq $true) -and (OperatingSystem -like "Windows Server* *")} -Properties * | 
      ForEach-Object { 
       $ps = Get-PSVersion 
       $server = $_ 

       New-Object -TypeName PSObject -Property @{ 
        Name  = $server.Name 
        OS  = $server.OperatingSystem 
        IPAddress = $server.IPv4Address 
        Location = $server.CanonicalName 
        PSVersion = $ps.Major 
       } 
      } 
$servers | Select Name,Location,OS,IPAddress,PSVersion | FT -AutoSize 

Antwort

1

Ok so mit Invoke-Command starten, Sie müssen dieses Cmdlet sagen, welche Server zum Ziel, nur nannte es Wenn Sie eine Schleife über Servernamen ziehen, rufen Sie sie weiterhin auf Ihrem lokalen Computer auf. Sie müssen daher den Parameter -computername verwenden und Ihrer Funktion ein Argument übergeben, das an invoke-command übergeben wird. Welche etwas würde wie folgt aussehen:

function Get-PSVersion($name) { 
    (Invoke-Command -ComputerName $name -Scriptblock {$PSVersionTable.psversion | Select Major}) 
} 

Sie werden bemerken, zog ich Ihre wählen auch, ist dies nicht unbedingt notwendig, aber imo sieht es sauberer und bedeutet etwas weniger Daten über das Netzwerk gesendet wird. beachten Sie, dass dies ein Objekt mit einer einzigen Eigenschaft erstellen Haupt genannt, wenn Sie nur die Versionsnummer zurückgegeben als eine ganze Zahl wollen Sie würde es wie folgt

function Get-PSVersion($name) { 
    (Invoke-Command -ComputerName $name -Scriptblock {$PSVersionTable.psversion.Major}) 
} 

Sie tun, um eine zusätzliche Schleife hinzufügen müssen Wenn Sie mehr als eine Domain ins Visier nehmen wollen, wollen Sie im Grunde ein Array der Domains, auf die Sie zielen wollen, und dann über diesen Array laufen, get-adcomputer aufrufen und den Domain-Namen für den Parameter -server angeben. Ich habe ein vereinfachtes Beispiel eingefügt, das Sie in Ihren eigenen Code einfügen können.

$arr = @("test.domain","othertest.domain") 

    foreach($domain in $arr){ 
    Get-ADComputer -Filter * -Server $domain 
} 

Hoffe, dass hilft!

+0

Vielen Dank für die Antwort, aber es funktioniert nicht für mich. Die Ausgabe lässt jetzt PSversion, Standort, Betriebssystem und IP aus. Es gibt nur den Namen der Maschine zurück. – user3413352

+0

Ich habe die Funktion nur auf einer meiner Maschinen ausgeführt und die Versionsnummer wie erwartet zurückgegeben. Kannst du deinen aktuellen Code posten? –

+0

Funktion Get-PSVersion ($ Server) { (Invoke-Befehl -ComputerName $ Server -Scriptblock {$ PSVersionTable.psversion.Major}) } $ arr = @ ("myDomain.local", "myDomain.local") foreach ($ domain in $ arr) { $ server = Get-ADComputer -Filter {(aktiviert -eq $ true) -und (Betriebssystem -ähnlich "Windows Server * *")} -Server $ domain -Eigenschaften * | Wählen Sie -First 5 ForEach-Object { $ ps = Holen-PSVersion $ server = $ _ Alles unten ist das gleiche wie ich ursprünglich oben gepostet. Nochmals vielen Dank – user3413352

0

Habe es zur Arbeit. Danke für die Hilfe.

clear-host 
$arr = @("x.local","x.local") 

foreach($domain in $arr){ 
$servers = (Get-ADComputer -Filter {(enabled -eq $true) -and (OperatingSystem -like "Windows Server* *")}-Server $domain -Properties *|Select -First 10) 
} 
$MasterList = @() 
foreach ($server in $servers) { 
$MyObj = New-Object PSObject -Property @{ 
Name = $server.Name 
Os = $server.OperatingSystem 
Ip = $server.IPv4Address 
PSV = Invoke-Command -ComputerName $server.Name -ScriptBlock {$PSVersionTable.psversion} 
} 
$MasterList += $MyObj 
} 
$MasterList|Select Name,PSV,OS,IP