jon 10 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 Hallo Leute. Ich bin neu im Scripting. Habe eien Aufgabe bekommen, auf mehreren Servern (hierfür habe ich eine CSV Liste erstellt) erst einen Dients beenden ,bestimmte Datein Namen,für allen Servern aus der CSC liste, aus einer Verzeichnis auslesen, Datein im Text File importieren, Datein auf allen Servern im Verzeichnis löschen und alle Dienste wieder neu starten: das ist meine vorgehensweise: $computerlist = Get-Content c:\Temp\Server.csv foreach ($computer in $computerlist) {Set-Service -Name OssecSvc -Status stopped} foreach ($computer in $computerlist) {Get-ChildItem –Path ‘C:\Program Files (x86)\ossec-agent\rids’ | select Parent,Name | Export-Csv -Path c:\Temp\ossec.txt | Remove-Item -path C:\Program Files (x86)\ossec-agent\rid\*'' -recurse} foreach ($computer in $computerlist) {Set-Service -Name OssecSvc -ComputerName c:\Temp\Server.csv -Status Running } Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 Und woi ist deine Frage? Was mir als erstes auffällt ist, dass du keine zwei gleichen foreaches brauchst, sondern in einem Foreach kannst du mehr machen. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 Jon, das wird so nix ... Wenn Du auf einem remote Computer etwas ausführen möchtest, must Du ihm das auch mitteilen. Ich gehe mal davon aus, dass Deine CSV-Datei einen Header enthält und in der Spalte, die "ComputerName" heißt, die Computernamen enthält. $computerlist = Get-Content c:\Temp\Server.csv $Result = foreach ($Computername in $computerlist.ComputerName) { if (Test-Connection -ComputerName $Computername) { Invoke-Command -ComputerName $Computername { Stop-Service -Name OssecSvc $FileList = Get-ChildItem -Path 'C:\Program Files (x86)\ossec-agent\rids'-Recurse $FileList | Select-Object -Property Parent, Name, @{Name = 'ComputerName'; Expression = { $ENV:ComputerName } } $FileList | Remove-Item Start-Service -Name OssecSvc } } } $Result | Export-Csv -Path c:\Temp\ossec.csv -NoTypeInformation Der Code ist von mir natürlich ungetestet ... also bitte mit einem Test-Computer und Test-Daten testen, bevor Du das auf Deine produktive Umgebung loslässt. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 Start/Stop-Service geht auch remote und Dateien löschen auch. D.h. Invoke-command kann man sich sparen. Zitieren Link zu diesem Kommentar
jon 10 Geschrieben 23. April 2020 Autor Melden Teilen Geschrieben 23. April 2020 vor 12 Minuten schrieb BOfH_666: Jon, das wird so nix ... Wenn Du auf einem remote Computer etwas ausführen möchtest, must Du ihm das auch mitteilen. Ich gehe mal davon aus, dass Deine CSV-Datei einen Header enthält und in der Spalte, die "ComputerName" heißt, die Computernamen enthält. $computerlist = Get-Content c:\Temp\Server.csv $Result = foreach ($Computername in $computerlist.ComputerName) { if (Test-Connection -ComputerName $Computername) { Invoke-Command -ComputerName $Computername { Stop-Service -Name OssecSvc $FileList = Get-ChildItem -Path 'C:\Program Files (x86)\ossec-agent\rids'-Recurse $FileList | Select-Object -Property Parent, Name, @{Name = 'ComputerName'; Expression = { $ENV:ComputerName } } $FileList | Remove-Item Start-Service -Name OssecSvc } } } $Result | Export-Csv -Path c:\Temp\ossec.csv -NoTypeInformation Der Code ist von mir natürlich ungetestet ... also bitte mit einem Test-Computer und Test-Daten testen, bevor Du das auf Deine produktive Umgebung loslässt. Vielen Dank dafür, ich werde es testen und berichten Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 (bearbeitet) vor 7 Minuten schrieb Dukel: Start/Stop-Service geht auch remote und Dateien löschen auch. D.h. Invoke-command kann man sich sparen. Stimmt natürlich. Je nach Anzahl der Dateien ist das dann nur etwas langsamer. .... und das zusammenbasteln der UNC-Pfade sieht immer unelegant aus ... finde ich ... bearbeitet 23. April 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
jon 10 Geschrieben 23. April 2020 Autor Melden Teilen Geschrieben 23. April 2020 Hallo0, wollte nur einen Rückmeldung geben. Meine CSV Datei hatt leider keine Header, habe auf dem Script folgendes eingetragen: $a = Import-Csv -Path 'C:\Temp\test.csv' -Header "ComputerName" ich dachte es werden die Server somit gelesen. Script sieht es nun so aus: $computerlist = Get-Content c:\Temp\Test.csv $a = Import-Csv -Path 'C:\Temp\test.csv' -Header "ComputerName" $Result = foreach ($Computername in $computerlist.ComputerName) { if (Test-Connection -ComputerName $Computername) { Invoke-Command -ComputerName $Computername { Stop-Service -Name OssecSvc $FileList = Get-ChildItem -Path 'C:\Program Files (x86)\ossec-agent\rids'-Recurse $FileList | Select-Object -Property Parent, Name, @{Name = 'ComputerName'; Expression = { $ENV:ComputerName } } $FileList | Remove-Item Start-Service -Name OssecSvc } } } $Result | Export-Csv -Path c:\Temp\ossec.csv -NoTypeInformation Leider wenn ich es tzeste bekomem cih einen Fhelrmeldung: PS D:\Users\Desktop> $Result = foreach ($Computername in $computerlist.ComputerName) Missing statement body in foreach loop. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingForeachStatement Hmm ??? Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 (bearbeitet) Jon, bitte Code als Code formatieren. Hier nochmal Deine ersten Zielen Code. Vielleicht kommst Du selber drauf: $computerlist = Get-Content c:\Temp\Test.csv $a = Import-Csv -Path 'C:\Temp\test.csv' -Header "ComputerName" $Result = foreach ($Computername in $computerlist.ComputerName) { ... wenn nicht, gib Bescheid, dann helfen wir. EDIT: ... noch ein Tipp: Wenn Du zum Powershell-Scripte schreiben VSCode benutzt, wirst Du auf solche Fehler hingewiesen. bearbeitet 23. April 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 VSCode ist für Geeks - Nerds programmieren in Notepad SCNR... Zitieren Link zu diesem Kommentar
jon 10 Geschrieben 23. April 2020 Autor Melden Teilen Geschrieben 23. April 2020 vor 6 Stunden schrieb BOfH_666: Jon, bitte Code als Code formatieren. Hier nochmal Deine ersten Zielen Code. Vielleicht kommst Du selber drauf: $computerlist = Get-Content c:\Temp\Test.csv $a = Import-Csv -Path 'C:\Temp\test.csv' -Header "ComputerName" $Result = foreach ($Computername in $computerlist.ComputerName) { ... wenn nicht, gib Bescheid, dann helfen wir. EDIT: ... noch ein Tipp: Wenn Du zum Powershell-Scripte schreiben VSCode benutzt, wirst Du auf solche Fehler hingewiesen. Leider nicht, meine kentnnise sind in betracht zu Powershell sehr begrenzt. was ich gesehen habe ist das die zwei ersten Zeilen fast identisch sind. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 23. April 2020 Melden Teilen Geschrieben 23. April 2020 (bearbeitet) vor 48 Minuten schrieb jon: Leider nicht, meine kentnnise sind in betracht zu Powershell sehr begrenzt. was ich gesehen habe ist das die zwei ersten Zeilen fast identisch sind. Hmmm ... dann ist die Aufgabe hier wohl Deine Hausaufgabe, oder? Die Variablennamen haben eine Bedeutung. Die Variable, die ich im Code mit der ersten Zeile definiere, benutze ich in der nächsten Zeile gleich wieder sozusagen als Input. Du erzeugst eine Variable - zwar mit der richtigen Befehllszeile - aber Du benutzt sie dann nicht. Ergänze einfach den Parameter -Header mit dem Wert "ComputerName" bei meiner Variablenzuweisung für $Computerlist lass Deine zusätzliche Zeile weg. Dann läuft's. Du könntest auch einfach die Header-Zeile in Deiner CSV-Datei ergänzen - das kommt dann auf's Gleiche raus. Und Du solltest Dir die Grundlagen von Powershell aneignen. Wenn Du vorhast noch ne Weile in Windows-System-Umgebungen unterwegs zu sein, wird sich das mit Sicherheit für Dich lohnen. vor einer Stunde schrieb daabm: VSCode ist für Geeks - Nerds programmieren in Notepad SCNR... So'n Quatsch. Wir haben 2020!! Solche Dinosaurier-Ressentiments gehören ins letzte Jahrtausend!! Geeks und Nerds benutzen einfach das, was sie ihnen am besten gefällt. So! bearbeitet 23. April 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
jon 10 Geschrieben 24. April 2020 Autor Melden Teilen Geschrieben 24. April 2020 (bearbeitet) vor 10 Stunden schrieb BOfH_666: Hmmm ... dann ist die Aufgabe hier wohl Deine Hausaufgabe, oder? Die Variablennamen haben eine Bedeutung. Die Variable, die ich im Code mit der ersten Zeile definiere, benutze ich in der nächsten Zeile gleich wieder sozusagen als Input. Du erzeugst eine Variable - zwar mit der richtigen Befehllszeile - aber Du benutzt sie dann nicht. Ergänze einfach den Parameter -Header mit dem Wert "ComputerName" bei meiner Variablenzuweisung für $Computerlist lass Deine zusätzliche Zeile weg. Dann läuft's. Du könntest auch einfach die Header-Zeile in Deiner CSV-Datei ergänzen - das kommt dann auf's Gleiche raus. Und Du solltest Dir die Grundlagen von Powershell aneignen. Wenn Du vorhast noch ne Weile in Windows-System-Umgebungen unterwegs zu sein, wird sich das mit Sicherheit für Dich lohnen. So'n Quatsch. Wir haben 2020!! Solche Dinosaurier-Ressentiments gehören ins letzte Jahrtausend!! Geeks und Nerds benutzen einfach das, was sie ihnen am besten gefällt. So! Vielen Dank für deine Hilfe. das mit dem Powershell Code und formatieren bin am lernen, weiß nicht was da als Quelle am Besten ist? Ich habe meine CSV Datei im Excel Importiert und auf dem Format UTF8 geändert, leider weiß ich nciht muss ich Tabtrenung und Komma benutzen oder nur komma. Jetzt wenn ich die Zeile $Computerlist in Powershell ausführe läuft ohne feheler, Leider ist die erzeugte Datei immer noch leer. Habe testweise auf einem Server die Zeilen ausgeführt: Get-ChildItem -Path 'C:\Program Files (x86)\ossec-agent\rids'-Recurse $Result | Export-Csv -Path c:\Temp\ossec.csv -NoTypeInformation Es wird der Inhalt gelesen, aber der erzeugte Datei ist leer, ist das was mit dem Berechtigungen, obwohl ich Powershell als Admin ausfüre?? bearbeitet 24. April 2020 von jon Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 24. April 2020 Melden Teilen Geschrieben 24. April 2020 vor 41 Minuten schrieb jon: das mit dem Powershell Code und formatieren bin am lernen, weiß nicht was da als Quelle am Besten ist? Jetzt weiß ich nicht, wovon Du genau sprichst. Ich meinte weiter oben, dass Du, wenn hier im Forum Code postest, diesen als Code formatieren solltest. Dadurch wird der Code so angezeigt, wie er auch in einer Entwicklungsumgebung oder in Notepad angezeigt werden würde. Also im Prinzip ohne jegliche Formatierung und ohne Zeilenumbrüche und so weiter. vor 41 Minuten schrieb jon: Ich habe meine CSV Datei im Excel Importiert und auf dem Format UTF8 geändert, leider weiß ich nciht muss ich Tabtrenung und Komma benutzen oder nur komma. Das ist für Powershell völlig egal. Du kannst sowohl beim Export als auch beim Import das Trennzeichen mit dem Parameter -Delimiter angeben. vor 41 Minuten schrieb jon: Jetzt wenn ich die Zeile $Computerlist in Powershell ausführe läuft ohne feheler, Leider ist die erzeugte Datei immer noch leer. ... und hier solltest Du jetzt den Code zeigen, den Du benutzt hast. Die Zeile, die ich jetzt im Hinterkopf habe, die mit der Variablen $ComputerList zu tun hat, würde eine CSV-Datei einlesen - nicht schreiben. vor 41 Minuten schrieb jon: Habe testweise auf einem Server die Zeilen ausgeführt: Get-ChildItem -Path 'C:\Program Files (x86)\ossec-agent\rids'-Recurse $Result | Export-Csv -Path c:\Temp\ossec.csv -NoTypeInformation Es wird der Inhalt gelesen, aber der erzeugte Datei ist leer, ist das was mit dem Berechtigungen, obwohl ich Powershell als Admin ausfüre?? Ich empfehle Dir dringendst, Dir als Erstes die Grundlagen der Powershell anzueignen. Sonst wird es Dir schwer fallen, die Hilfen zu verstehen, die Du hier bekommst. Du hast offenbar die Grundprinzipien noch nicht verstanden. Wenn Du mit gefährlichem Halbwissen an produktiven Server operierst, kannst Du ne Menge kaputt machen. Also wenn Du testest, solltest Du das ausschließlich in einer Test-Umgebung tun. Du solltest niemals Code ausführen, den Du nicht verstehst. Mir ist grad aufgefallen, dass ich oben im Code einen bösen Schnitzer eingebaut habe, sorry ... passiert auch erfahrenen Leuten mal ... hier also nochmal der korrigierte Code: $computerlist = Import-Csv -Path 'c:\Temp\Server.csv' -Header 'ComputerName' $Result = foreach ($Computername in $computerlist.ComputerName) { if (Test-Connection -ComputerName $Computername) { Invoke-Command -ComputerName $Computername { Stop-Service -Name OssecSvc $FileList = Get-ChildItem -Path 'C:\Program Files (x86)\ossec-agent\rids'-Recurse $FileList | Select-Object -Property Parent, Name, @{Name = 'ComputerName'; Expression = { $ENV:ComputerName } } $FileList | Remove-Item Start-Service -Name OssecSvc } } } $Result | Export-Csv -Path c:\Temp\ossec.csv -NoTypeInformation Zitieren Link zu diesem Kommentar
jon 10 Geschrieben 24. April 2020 Autor Melden Teilen Geschrieben 24. April 2020 (bearbeitet) Zitat Jetzt weiß ich nicht, wovon Du genau sprichst. Ich meinte weiter oben, dass Du, wenn hier im Forum Code postest, diesen als Code formatieren solltest. Dadurch wird der Code so angezeigt, wie er auch in einer Entwicklungsumgebung oder in Notepad angezeigt werden würde. Also im Prinzip ohne jegliche Formatierung und ohne Zeilenumbrüche und so weiter. Hier habe ich dich missverstanden, werde in Zukunft achten. Zitat Das ist für Powershell völlig egal. Du kannst sowohl beim Export als auch beim Import das Trennzeichen mit dem Parameter -Delimiter angeben. Das ist was ich noch lernen muss. Zitat .. und hier solltest Du jetzt den Code zeigen, den Du benutzt hast. Die Zeile, die ich jetzt im Hinterkopf habe, die mit der Variablen $ComputerList zu tun hat, würde eine CSV-Datei einlesen - nicht schreiben. Ja das war der Code mit $Computerlist get content. Zitat Ich empfehle Dir dringendst, Dir als Erstes die Grundlagen der Powershell anzueignen. Sonst wird es Dir schwer fallen, die Hilfen zu verstehen, die Du hier bekommst. Du hast offenbar die Grundprinzipien noch nicht verstanden. Wenn Du mit gefährlichem Halbwissen an produktiven Server operierst, kannst Du ne Menge kaputt machen. Also wenn Du testest, solltest Du das ausschließlich in einer Test-Umgebung tun. Du solltest niemals Code ausführen, den Du nicht verstehst. Da bin ich dabei, Das Script habe auf einem ausrangierten Server ausgefürt, ohne die Liste zu lesen. Zitat Mir ist grad aufgefallen, dass ich oben im Code einen bösen Schnitzer eingebaut habe, sorry ... passiert auch erfahrenen Leuten mal ... hier also nochmal der korrigierte Code: Habe es korrigert, danke für deine Hilfe. Nun wenn ich es jetzt teste bekomme dies: "PS > D:\Users\Desktop\Powershell_OSSCE.ps1 Test-Connection : Testing connection to computer 'ComputerName' failed: Der angeforderte Name ist gültig, es wurden jedoch keine Daten des angeforderten Typs gefunden At D:\Users\Desktop\Powershell_OSSCE.ps1:4 char:9 + if (Test-Connection -ComputerName $Computername) { + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (ComputerName:String) [Test-Connection], PingException + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand Test-Connection : Testing connection to computer 'ComputerName' failed: Der angeforderte Name ist gültig, es wurden jedoch keine Daten des angeforderten Typs gefunden At D:\Users\Desktop\Powershell_OSSCE.ps1:4 char:9 + if (Test-Connection -ComputerName $Computername) { + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (ComputerName:String) [Test-Connection], PingException + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand " bearbeitet 24. April 2020 von jon Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 24. April 2020 Melden Teilen Geschrieben 24. April 2020 vor 21 Minuten schrieb jon: Das Script habe auf einem ausrangierten Server ausgefürt, ohne die Liste zu lesen. ..... Nun wenn ich es jetzt teste bekomme dies: "PS > D:\Users\Desktop\Powershell_OSSCE.ps1 Test-Connection : Testing connection to computer 'ComputerName' failed: Der angeforderte Name ist gültig, es wurden jedoch keine Daten des angeforderten Typs gefunden Du führst das Script aus, aber versorgst es quasi nicht mit den nötigen Eingaben. Das kann so nicht funktionieren. Bitte - das hier führt zu nix, wenn Du nicht VORHER die Grundlagen von Scripting/Programmierung im Allgemeinen und von Powershell im Speziellen gelernt hast. Wir können Dir hier nicht Schritt für Schritt beibringen, wie man Scripte programmiert. Du hast offensichtlich noch nicht verstanden, was Variablen sind und wofür und wie man sie benutzt. Bitte jetzt erstmal ein Buch lesen oder einen Video-Kurs anschauen oder sowas. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.