Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.091
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von BOfH_666

  1. vor 10 Minuten schrieb addy0604:

    ...  das die Parameter in einer bestimmten Reihenfolge angeordnet sein müssen. ....

    Es ist wohl nicht nur das gewesen, sondern irgendwie eine Kombination. Bei meiner Recherche hatte ich irgendwo gelesen -es ging eigentlich um einen anderen Fehler - dass das Tool den zu verarbeitenden Dateinamen als letztes in der Zeile erwartet. Und wenn es den Parameter an letzter Stelle nicht interpretieren kann, geht es davon aus, dass es ein Dateiname ist. Deshalb auch die Meldung, dass es immer nur eine Datei signieren/verarbeiten kann. Na egal ... schön, dass es doch funktioniert

    vor 20 Minuten schrieb addy0604:

    Beitrag kann erfolgreich geschlossen werden.

    ... einfach die entsprechende Antwort als "die Lösung" kennzeichnen!  ;-)

  2. So ... jetze ich ... ;-):D Ich hab mir mal den Spaß gemacht, mir ein selbstsigniertes Zertifikat erstellt, hab mir ein paar XML-Dateien zusammengesucht und ein bissl rumprobiert. Und was soll ich sagen - es scheint zu funktionieren. Jedenfalls erhalte ich keine Fehlermeldungen und die Signaturdateien werden erstellt.  :-D 

    Hier ist der passende Code:

    $OpenSSL_EXE = 'C:\_Temp\openssl\openssl.exe'
    $SourcePath = 'C:\_Temp\xml'
    $CertFile = 'C:\_Temp\cert.pem'
    Get-ChildItem -Path $SourcePath -Filter *.xml |
        ForEach-Object {
            $outfile = Join-Path -Path $_.Directory -ChildPath $($_.Name + '.sig')
            Start-Process -FilePath $OpenSSL_EXE -ArgumentList "dgst -sha512 -binary -out $outfile -sign $CertFile -passin pass:""passw0rd!"" $($_.FullName)" -NoNewWindow
        }

    !! Nicht wundern - trotz des Parameters -NoNewWindow poppt in der ISE kurz ein weiteres Konsolenfenster auf - vielleicht für die 1000+ XML-Dateien einfach die normale Konsole nutzen ...  ;-)

    • Like 1
  3. Powershell is halt die modernere und eben auch bessere Technologie. Es laufen ja auch nur noch relativ wenige Leute mit "dummen" Mobiltelefonen durch die Gegend. Selbst Leute, die's nciht brauchen, haben heute meistens ein Smartphone.  ;-)

    Wenn Du am Wochenende mal ein bissl Langeweile hast (oder auch auf Arbeit ;-) ), kannst Du Dich kostenlos in der  Microsoft Virtual Academy mit Getting Started with Powershell ein bissl berieseln lassen. Das sollte Dir für die ersten Schritte schon das Rüstzeug verschaffen.

  4. OK ... da muss ich dann leider passen, mit cmd/batch bin ich nie richtig warm geworden und werde auch jetzt nicht mehr damit anfangen. ;-)  Sorry.

    Ich glaube aber trotzdem dass es sich unbedingt für Dich lohnen würde. Wenn Du nicht grad vor der Rente stehst und noch ne Weile in Windows-Umgebungen unterwegs sein willst, kommt man bei komplexeren Sachen an Powershell nicht mehr vorbei. Und falls Du's beruflich brauchst, hast Du bei der nächsten Gehaltsverhandlung noch ein Pfeil mehr im Köcher.  ;-):D

    Und mit Powershell findet man nach meiner Erfahrung auch schneller Hilfe.

  5. vor 3 Stunden schrieb andrehamburg:

    ... aber der Versuch dein Skript zu starten, war erfolglos. :-(  ....

    hmmm ... wie äußert sich denn das? An fehlenden Rechten kann es eher nicht liegen. Was Du mit cmd/batch machen kannst, kannst Du auch Powershell machen. Und die Tools, die Du in cmd/batch ausrufen kannst, kannst Du auch in der Powershell aufrufen (snmpget z.B.) Und die Syntax von Powershell ist, jedenfalls denke ich das, deutlich intuitiver und weniger kryptisch als cmd/batch.

  6. Zitat

    Aber ich hätte gerne, daß der User dann eine Meldung beim Abmelden bekommt (so wie die Standardmeldung von Windows beim Abmelden/Herunterfahren, wenn noch etwas im Hintergrund
    geschieht, z.B. Bitte PC nicht ausschalten, es werden Updates installiert usw.

    Sprich, daß ich den Text dann mit Echo oder so in das Skript einbaue (z.B. PC nicht ausschalten, es werden Dateien kopiert)

    hmmm ... das ist ja quasi keine Frage, sondern eher ein Wunsch. ;-)  ...  oder eine Absichtserklärung ...  Also mit Powershell würde das schon funktionieren. Das Script müsste aber im User-Kontext gestartet werden - das heißt im Zweifel ist das Konsolenfenster zu sehen - wenigstens in der Taskleiste - und der Benutzer hätte natürlich immernoch die Möglichkeit das Ganze einfach zu schließen und trotzdem den Rechner auszuschalten.

  7. Dürfte es auch Powershell sein?

    Get-Content -Path 'liste.txt' |
        ForEach-Object -Process {
            [PSCustomObject]@{
                SYSTEMNAME = & "snmpget -v1 -Ov -c public $_ system.sysName.0"
                SYSLOCATION = & "snmpget -v1 -Ov -c public $_ system.sysLocation.0"
                AUSLESEDATUM = & "snmpget -v1 -Ov -c public $_ .1.3.6.1.4.1.2606.7.3.2.8.0"
                AUSLESEUHRZEIT = & "snmpget -v1 -Ov -c public $_ .1.3.6.1.4.1.2606.7.3.2.9.0"
                ZAEHLERSTAND = & "snmpget -v1 -Ov -c public $_ .1.3.6.1.4.1.2606.7.4.2.2.1.10.1.20"
            }
        } | 
            Export-Csv -Path 'Output.csv' -Encoding UTF8 -Delimiter ';' -NoTypeInformation

    Vielleicht müsstest Du noch an den SNMP-Kommandos feilen und vielleicht die Pfade bei den Dateinamen ergänzen, aber der Rest sollte laufen.  ;-)

  8. vor einer Stunde schrieb addy0604:

    Damit passt zwar nun die Signaturdatei, aber es ändert leider nichts an der Tatsache, das ich für jede XML-Datei das Kennwort eingeben muss :(

    hmmmm ... ich glaube ja, dass Du zu schnell aufgibst ;-) ... Du bist auf der Zielgeraden und willst jetzt die Flinte ins Korn werffen??   ... schau Dir doch nochmal die Doku zu OpenSSL und den Kommandozeilenoptionen an. Dort gibt es noch weitere Optionen, wie man das Passwort an das Tool übergeben kann.

    • Danke 1
  9. vor 1 Minute schrieb addy0604:

    Leider kommt wieder die altbekannte Meldung: dgst: Can only sign or verify one file.

    Ich denke das wird mit dem Schalter -passin zusammenhängen.

    Ich würde ja eher auf die Übergabe des Dateinamens der zu bearbeitenden Datei tippen. Was passiert denn, wenn Du das Kommando manuell mit einem spezifischen Dateienamen in einer Powershell-Konsole eingibst?

  10. vor 52 Minuten schrieb addy0604:

    Grundsätzlich hast du natürlich recht, das immer mehr mit Powershell gemacht wird. Leider, ich gestehe, ich bin eingefleischter Mausschubser und finde Powershell zum... übergeben, sorry.

    Ich finde da echt keinen Draht hin. Aber auch Grundlagen (selbst wenn ich sie hätte) verblassen, wenn man einmal im Jahr ein kleines Script braucht. Eine Batchdatei ist für mich halbwegs nachvollziehbar, Powershell ist für mich ein Sack voll Hieroglyphen und bin da völlig überfordert.

    Wenn Du die Grundlagen einer Technologie einmal richtig gelernt hast, dann hilft Dir das auch weiter, wenn Du sie nur selten benutzt - 'ist wie Fahrradfahren - Du fällst ja auch nicht um, nur weil Du mal n' halbes Jahr nicht gefahren bist.

    Ein guter und sogar ansatzweise unterhaltsamer Einstieg gelingt mit dem kostenlosen Videokurs der Microsoft Virtual Acadmy - Getting Started with Microsoft Poswershell. Das Anschauen der enthaltenen Videos dauert nur ca 8-10 Stunden, aber es wird Dir die Augen öffnen und vielleicht in Zukunft eine Menge Deiner Arbeitszeit einsparen weil Du viele Sachen einfach automatisieren kannst.

    Wenn man des Englishen mächtig ist, ist Powershell-Code in Grenzen quasi selbsterklärend, weil eben keine Hieroglyphen benutzt werden, wie das z.B. bei machen Linux-Tools üblich ist oder war. z.B. braucht man cmdlets wie Test-Path oder Get-Process oder Get-Service nicht wirklich aufwändig erklären, oder?  ;-)

     

    Nun zum Script: Wie Dukel schon geschrieben hat: Wenn die Openssl.exe nicht in der Umgebungsvariable "Path" zu finden ist, musst Du den kompletten Pfad angeben, inclusive der Erweiterung. Die Parameter -Wait und -NoNewWindow zu ergänzen kann auch nicht schaden. -NoNewWindow leitet die Konsolenausgabe von OpenSSL in die Powershell-Konsole um und -Wait wartet einfach mit der Ausführung bis die Aufgerufene externe Anwendung (also OpenSSL in diesem Fall) fertig ist und die Kontrolle wieder abgegeben hat.

    • Like 1
  11. Format-cmdlets sollten IMMER als LETZTES in der Pipeline kommen. Alles andere macht normalerweise keinen Sinn. Wenn Du ein Format-cmdlet wie Format-Table benutzt, machst Du aus den Objecten, die üblicherweise von Powershell die Pipeline entlanggereicht werden, Pixel auf auf Deinem Bildschirm, die nicht mehr vernünftig weiterverarbeitet werden können. Measure-Object erwartet ein Objekt bzw. Objekte - wenn es die nicht bekommt, zählt es, was es eben zählen kann ... vermutlich die Zeilen inclusive Leerzeilen.

     

    Edit: Noch'n allgemeiner Tipp: Gerade in der Konsole ist es fast immer hilfreich, quasi an jede Pipeline-Etappe ein -ov a oder -ov b oder -ov c usw. anzuhängen. Das macht die Zwischenschritte als Variablen verfügbar und erleichtert häufig die weitere Verarbeitung oder Verfeinerung der Daten. -ov ist dabei der Alias für -OutVariable und a oder b oder c der Variablenname.

    zB.:

    get-aduser .... -ov a | ft

    ... gibt Dir die gefundenene ADUser als Tabelle aus. aber wenn Du auf die "Original-Daten" zugreifen willst, kannst Du einfach $a aus geben und z.B. mit

    $a.count

    ... die Anzahl ausgeben.

    • Like 1
  12. Hmmm ... wenn Du noch ne Weile in "Windows-Umgebungen unterwegs sein möchtest", nimmst Du Dir bei nächster Gelegenheit mal bitte etwas Zeit und schaffst Dir die Grundlagen von Powershell drauf. Ich glaube, es wird sich für Dich auszahlen und man kommt in Zukunft einfach nicht mehr dran vorbei.  ;-)

    Bei der Zuweisung der Variablen gehören die "Werte" in Anführungszeichen - so wie es oben in meinem Code-Beispiel zu sehen ist.

  13. Hmmm ... also ich bin kein Freund von Batch/cmd und auch nie richtig warm geworden damit, aber wenn ich das nicht falsch verstanden habe, sollte es mit Powershell ungefähr so funktionieren:

    $SourcePath = 'Pfad zum Ordner mit XML-Dateien'
    $CertFile = 'Zertifikat.pem'   # am Besten vermutlich inclusive Pfad
    Get-ChildItem -Path $SourcePath -Filter *.xml |
        ForEach-Object {
            $outfile = $_.BaseName + '.sig'
            Start-Process -FilePath openssl -ArgumentList "dgst -sha512 -binary -out $outfile -sign $CertFile  $_.FullName -passin pass:""hier das Passwort"""
        }

    Probier ma!  ;-)  (natürlich erstmal nur an 2 oder 3 Test-XML-Dateien)

  14. ... und wenn's was Regelmäßigeres werden soll, kannst Du Dir hier schon mal ein paar Anregungen holen:

     

    https://www.netz-weise-it.training/weisheiten/tipps/item/417-mehrfach-umbenennen-mit-powershell-rename-item-und-regulaeren-ausdruecken.html

     

    ;-)

    vor 3 Minuten schrieb benji84:

    Leider habe ich mich mit dem Thema Powershell bisher nur sehr rudimentär befasst..

    Na dann wird's aber jetzt höchste Zeit!!  ;-):D

     

    Schau mal hier ...

    https://mva.microsoft.com/en-us/training-courses/getting-started-with-powershell-3-0-jump-start-8276?l=r54IrOWy_2304984382

     

    da kannst Du Dich ein paar Stunden berieseln lassen und lernst nebenbei auch noch die Grundlagen von Powershell ...

  15. vor 9 Minuten schrieb Gu4rdi4n:

    Ist das so sinnvoller als mit ner schleife?

    Das kommt auf Deine Anforderungen und auf Deine Fähigkeiten an.  ;-)  Aber wenn das den Job erstmal erledigt - super. Ich würde aber dringend empfehlen, sich erstmal die Grundlagen draufzuschaffen. Der Videokurs in der MVA dauert nur ca 8 - 10 Stunden und bildet schon mal eine solide Grundlage. 

  16. vor 26 Minuten schrieb Gu4rdi4n:
    Da ich mit Powershell noch nicht so viel am Hut habe,

    Wie schade  ... ein guter Startpunkt ist der kostenlose VideoKurs  in der Microsoft Virtual Academy - Getting Started with Microsoft Powershell.

     

    Vernünftig formatiert und die Aliasse ausgeschrieben sieht der Code so aus:

    Get-ChildItem *.ini | 
        ForEach-Object {
            if (-not(Test-Path (".\config_bak\" + $_.name))) {
                Copy-Item $_ .\config_bak -passthru | Select-Object -Property name
            }
        }

     

    • Danke 1
  17. Mit dem Vergleich-Operator -contains prüfst Du ob ein einzelnes Element in einem Array von Elementen enthalten ist. Dabei müssen, bis auf die -Groß-Klein-Schreibung, die Elemente identisch sein, um einen positiven Treffer zu erzeugen.

    $a = 'Eins','zwei','DREI','vIeR','FuEnF','sechs'
    $b = 'drei'
    $a -contains $b

    sollte ein $true zurückliefern. Während zum Beispiel ...

    $a = 'Eins','zwei','DREI','vIeR','FuEnF','sechs'
    $b = ' drei'
    $a -contains $b

    ... ein $false als Ergebnis liefert. (Man beachte das zusätzliche Leerzeichen).

    Hast Du überprüft, ob Dein Trimmen, die von Dir erwarteten Resultate liefert?

    Gibt es ein Muster bei den Gruppen, die nicht erkannt werden?

     

    Unabhängig davon:

    Get-ADGroup -Filter * -Properties *

    Diese Zeile saugt ALLE Gruppen mit ALLEN Eigenschaften aus Deinem AD. Das dauert länger als nötig und erzeugt (wenigstens kurzzeitig) unnötig große Last auf dem AD-Controller. Empfehlenswert wäre, die Suche mittels -SearchBase auf die entsprechende OU zu begrenzen und unter -Properties nur die zusätzlichen Eigenschaften auszugeben, die wirklich im weiteren Verlauf des Scripts benötigt werden.

    • Danke 1
×
×
  • Neu erstellen...