Jump to content

Dienst auf mehrern Servern. mit Powersshell, beenden Datein Namen herausfinden Datein löschen


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

Empfohlene Beiträge

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 }

 

 

 

Link zu diesem Kommentar

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. :achtung:

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

Vielen Dank dafür, ich werde es testen und berichten

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

bearbeitet von BOfH_666
Link zu diesem Kommentar

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 ???

 

 

 

 

Link zu diesem Kommentar

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. :thumb1:

 

EDIT:  ... noch ein Tipp: Wenn Du zum Powershell-Scripte schreiben VSCode benutzt, wirst Du auf solche Fehler hingewiesen.  ;-) 

bearbeitet von BOfH_666
Link zu diesem Kommentar
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. :thumb1:

 

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.

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

 

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!  :pfui1:  :rocknroll:  :spock:  ;-) :D

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 10 Stunden schrieb BOfH_666:

Hmmm ... dann ist die Aufgabe hier wohl Deine Hausaufgabe, oder?  ;-) :D 

 

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!  :pfui1:  :rocknroll:  :spock:  ;-) :D

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

 

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

 

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...