Jump to content
nv_it

Mit Powershell Datei von mehreren Rechnern kopieren + LastBootUpTime von mehreren Rechner abfragen

Recommended Posts

Hallo zusammen,

 

ich habe mal wieder zwei kleine Aufgaben die ich mit Powershell realisieren möchte.

Folgende Situation: Ich habe ca. 145 Rechner von denen ich eine Datei kopieren will, die bei allen Rechnern im gleichen Pfad liegt.

Ich hab das soweit schonmal mit dem Copy-Item gebaut jedoch kommt es mir so vor als würde es auch schöner gehen als jeden Rechner in eine eigene Variable zu packen. Da die kopierten Dateien im gleichen Share landen und jeweils mit Rechnername benannt werden sollen.

Hier mal mein Ansatz:

$Rechner1="\\XXX-X"

$Speicherort1="\\SERVER\SHARE\Unterordner\$Rechner1.Datei.ini"

Copy-Item -Path "$Rechner1.FQDN\c$\xxx\xxx\Datei.ini" -Destination $Speicherort1


$Rechner2="\\YYY-Y"

$Speicherort2="\\SERVER\SHARE\Unterordner\$Rechner2.Datei.ini"

Copy-Item -Path "$Rechner2.FQDN\c$\xxx\xxx\Datei.ini" -Destination $Speicherort2
  
...
...

Wäre toll wenn mir da jemand einen evt. besseren Weg zeigen kann.

 

Zusätzlich dazu muss ich ein separates Skript erstellen mit dem ich die LastBootUpTime von mehreren Rechnern abfrage. Dazu habe ich auch etwas geschrieben was mir allerdings immer nur von einer Maschine die LastBootUpTime liefert:

$Rechner = "PC-XY.FQDN"

$os = Get-WmiObject -ComputerName $Rechner -Class win32_operatingsystem
$os.ConvertToDateTime($os.LastBootUpTime)

bei diesem Skript würde ich nach meinem Verständnis einfach mehrere Rechner in die Variable mit reinschreiben jedoch kommt dann der Fehler:

"Get-WmiObject : Der RPC-Server ist nicht verfügbar. 0x8007068A"

Wenn ich den Rechner jedoch einzelnd abfrage funktioniert das Skript.

Kann mir da evt. jemand sagen wo der Fehler liegt?

 

Vielen Danke schon jetzt für die Hilfe ;-)

 

Gruß Niklas

Share this post


Link to post
Share on other sites
Get-Help Foreach-Object -Examples :-)

$PCListe = @( 'PC', 'PC2' ) # oder per Get-Content aus einem Text
Foreach ($PC in $PCListe) { #mach irgend nen Kram mit $PC }

 

Share this post


Link to post
Share on other sites
1 minute ago, daabm said:

Get-Help Foreach-Object -Examples :-)

$PCListe = @( 'PC', 'PC2' ) # oder per Get-Content aus einem Text
Foreach ($PC in $PCListe) { #mach irgend nen Kram mit $PC }

 

Die 145 Rechner möchte man nicht in das Script oder eine Datei schreiben sondern aus einem Verzeichnisdienst / Datenbank (CMDB) auslesen.

Share this post


Link to post
Share on other sites

Hi,

 

werde ich tun, danke schonmal.

 

Zur WMI-Abfrage habe ich es einfach so probiert:

$Rechner = "PC-XY.FQDN","PC-Z.FQDN","PC-USW.FQDN"

Share this post


Link to post
Share on other sites
vor 9 Minuten schrieb nv_it:
 

bei diesem Skript würde ich nach meinem Verständnis einfach mehrere Rechner in die Variable mit reinschreiben jedoch kommt dann der Fehler:

Nein, nicht in EINE Variable, dann wird daraus nämlich EIN Rechnername. COmputername kann eine Liste verarbeiten, aber das muß eine kommagetrennte Liste von Rechnernamen (oder Variablen) sein. Und ist so auch nicht zielführend.

 

BTW: Wenn einer der Rechner nicht erreichbar ist, hängt das ganze bis zum Timeout (beim Kopieren genauso). Wenn das einigermaßen performant sein soll, wirst um Jobs nicht herumkommen :-)

 

vor 3 Minuten schrieb Dukel:

Die 145 Rechner möchte man nicht in das Script oder eine Datei schreiben sondern aus einem Verzeichnisdienst / Datenbank (CMDB) auslesen.

Wir fangen langsam an. Schleifchen kommen später :-)

Share this post


Link to post
Share on other sites
26 minutes ago, nv_it said:

Hi,

 

werde ich tun, danke schonmal.

 

Zur WMI-Abfrage habe ich es einfach so probiert:


$Rechner = "PC-XY.FQDN","PC-Z.FQDN","PC-USW.FQDN"

Das geht prinzipell so, aber dein $os beinhaltet ein Array von WMI Ergebnissen.

$os.ConvertToDateTime($os.LastBootUpTime)

wird so nicht gehen.

$os | % {$_.ConvertToDateTime($_.LastBootUpTime)}

 

Dein Fehler "RCP Server ist nicht verfügbar" hat einen anderen Grund.

Share this post


Link to post
Share on other sites

Dann wird wohl einer der Remote-Computer aus sein. Daher mein Hinweis auf Jobs und ggf. mit Test-NetConnection abfangen. Ein Oneliner wird das nicht, wenn es schön und schnell sein soll :-)

Share this post


Link to post
Share on other sites

nein ich habe das jetzt Testweise mit 2 Rechnern gemacht. wenn ich das bei jedem Rechner einzelnd abfrage funktioniert es einwandfrei, wenn ich jedoch beide rechner in die Variable schreibe klappt es nicht, da scheint er schon ab dieser Zeile ein Problem zu haben:

$os = Get-WmiObject -ComputerName $Rechner -Class win32_operatingsystem

Share this post


Link to post
Share on other sites

Nur ganz nebenbei bemerkt ...  ein ausreichend aktuelles Betriebssystem mit ausreichend aktueller Powershell-Version vorausgesetzt, wäre es empfehlenswert, statt

Get-WmiObject -Class win32_operatingsystem |
    Select-Object -Property LastBootUpTime

lieber

Get-CimInstance -ClassName CIM_OperatingSystem |
    Select-Object -Property LastBootUpTime

zu benutzen. So erledigt die Powershell die nötige Konvertierung von selbst.  ;-):D

Share this post


Link to post
Share on other sites

Moin,

danke schonmal für die vielen hilfreichen Antworten und Tipps.

Bin etwas weitergekommen, beide Skripte funktionieren jetzt soweit das wenn ich die Rechner einzelnd mit in das Skript (in die Variable) schreibe.

$PCListe = @('PC1','PC2')
ForEach ($PC in $PCListe)
{
   Copy-Item -Path \\$PC\c$\xxx\xxx\xxx.ini -Destination "\\server\xxx\xxx\$PC.xxx.ini"
}

Wenn ich allerdings versuche da das Get-ADComputer mit einzubauen erhalte ich aktuell noch Fehler:

$PCListe = Get-ADComputer -Filter 'Name -like "xx*-S"' -Properties Name | FT Name

ForEach ($PC in $PCListe)
{
    Copy-Item -Path "\\$PC\c$\xxx\xxx\xxx.ini" -Destination "\\server\xxx\xxx\$PC.xxx.ini"
}

Fehler: Der Pfad "\\Microsoft.PowerShell.Commands.Internal.Format.GroupStartData\\XX\xx.ini" kann nicht gefunden werden... in Zeile 5 Zeichen 5 Copy-Item....

Also er sucht den Pfad garnich nach dem Rechnernamen. Bin gerade etwas ratlos.

 

Wenn ich mir einfach mal die Variable $PCListe ausgeben lasse sehe ich aber das diese richtig gefüllt ist.

Edited by nv_it

Share this post


Link to post
Share on other sites

FT heisst Format-Table und ist für die Ausgabe zuständig.

Du kannst mit .property auf einzelne Properties zugreifen:

(Get-ADComputer -Filter 'Name -like "xx*-S"' -Properties Name).Name
# der Name wird standardmäßig ausgegeben. Es reicht:
(Get-ADComputer -Filter 'Name -like "xx*-S"').Name

Alternativ kannst du das komplette Objekt übergeben und die Properties in der Schleife nutzen:

$PCListe = Get-ADComputer -Filter 'Name -like "xx*-S"'

ForEach ($PC in $PCListe)
{
    Copy-Item -Path "\\$($PC.Name)\c$\xxx\xxx\xxx.ini" -Destination "\\server\xxx\xxx\$($PC.Name).xxx.ini"
}

 

Share this post


Link to post
Share on other sites

Okay danke, das hilft mir schonmal weiter :-)

jetzt habe ich nochmal eine andere Frage zu meinem LastBootUpTime, das Skript sieht aktuell so aus:

$Rechner = (Get-ADComputer -Filter 'Name -like "XX*-M"').Name

ForEach ($PC in $Rechner)
{
    (Get-CimInstance -ClassName CIM_OperatingSystem -ComputerName $PC | Select-Object -Property LastBootUpTime)
}

das gibt mir schonmal brav die Startzeiten der Rechner aus, wie kann ich hier jetzt einstellen das mir das Skript zusätzlich den Rechnernamen zur jeweiligen Startzeit mitgibt?

Share this post


Link to post
Share on other sites

Die WMI und CIM cmdlets liefern üblicherweise eine Property PSComputerName mit. Wenn Du die im Select-Object mit angibst, sollte's passen ...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Werbepartner:



×
×
  • Create New...