Jump to content

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


Direkt zur Lösung Gelöst von nv_it,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar
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 :-)

Link zu diesem Kommentar
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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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.

bearbeitet von nv_it
Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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?

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...