Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.038
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von BOfH_666

  1. Weil das die Anforderung ist bzw. weil es so erwünscht ist

     

    Hmmm ... mal angenommen, ich kenne mich damit nicht aus und es hat mir auch keiner erklärt, wie man ein Auto bewegt. Weil ich mir erstmal nicht anders zu helfen weiß, schiebe ich es einfach dahin, wohin ich es haben will.   ... funktioniert ja erst mal. Weil ich es jetzt aber ein wenig eilig habe, frage ich meine Kumpels, ob sie mir schieben helfen können. Weil es gute Kumpels sind, tun sie das ... und wir sind tatsächlich schneller.  Yeaahh.  Einer der Kumpels hat dann die Idee, den komischen Hebel zwischen den Vordersitzen zu lösen - er hätte mal gehört, dass  das Ding Handbremse heißt. ... und siehe da ... das Schieben geht jetzt viel leichter.  :wink2:

     

    .... siehst Du wo die Geschichte hinführt? Wenn Du jetzt einen Kraftfahrer fragst, wie er die Aufgabe angehen würde und Du sagtest ihm, dass die Anforderung ist, das Auto zu schieben, würde der Dich auslachen ... und das zu Recht.  ;)

     

    Microsoft hat vorgesehen, in einer Enterprise-Umgebung die Einstellungen für den Internet Explorer per GPO zu setzen. Alles andere ist verschwendete Lebenszeit. Deine und unsere. :wink2:

    • Like 1
  2. Gerade für/in MSI-Installationen gibt es eine Technik, die ActiveSetup heißt. Am besten Du googlest das mal und ließt Dich ein bissl ein. Den gleichen Mechanismuss kann man auch "manuell" antriggern und damit dann "Benutzer-Einstellungen" manipulieren. Das macht sich dann als kurzzeitig auftauchende kleine Dialog-Box im oberen linken Bereich des Desktops bemerkbar, die manchmal nach INstallationen erscheint.  … hast Du vielleicht schon mal gesehen.

  3. Wenn ich Dir was empfehlen dürfte: Tu Dir selbst einen Gefallen und schaff Dir die Grundlagen von Powershell mit einem Buch oder Kurs oder Online-Tutorial drauf - jedenfalls irgendwie geordnet und didaktisch aufbereitet. Mit ein bisschen rumspielen entgehen Dir vermutlich ein paar grundlegende Verfahren und Methoden und das führt eher zu Missverständnissen, Fehlern und Frustration.

     

    Ich hatte ja oben schon den MVA-Einstiegs-Kurs verlinkt - hier in diesem Thread findest Du noch ein paar mehr gute Quellen, um mit Powershell anzufangen: Beginner Sites and Tutorials.

  4. OK, dann stellen wir das Ganze wieder etwas um und nutzen Dukels Vorschlag … der hatte ja funktioniert …

    $QuellPfad = 'der Pfad den Du beackern möchtest'
    $ErsteBeliebigeCSVDatei = Get-ChildItem -Path $QuellPfad -Filter *.csv -File | Select-Object -First 1 | Select-Object -ExpandProperty FullName
    $Datum = (Get-Content -Path $ErsteBeliebigeCSVDatei)[1].split(';')[16]
    $ZipDatei = Join-Path -Path 'Pfad zum Verzeichnis in dem die Zip-Datei landen soll' -ChildPath ($Datum + '.zip')
    
    Start-Process -FilePath zip.exe -ArgumentList "$ZipDatei $QuellPfad\*.csv $QuellPfad\*.pdf"
    Get-Date | Out-File -FilePath 'Log-Datei incl. Pfad' -Append -Encoding utf8
    Start-Process -FilePath outlook.exe -ArgumentList "/a $ZipDatei"
    
  5. Da Du nicht spezifiziert hast, aus welcher CSV-Datei das Datum ausgelesen werden soll, hab ich einfach mal den jetzigen Status Quo als Vorlage benutzt.

    Ich empfinde Powershell-Code immer viel weniger kryptisch als batch und für Leute mit Basis-Englisch-Kentnissen ansatzweise intuitiv. Es könnte also so aussehen:

    $DatumHeute = Get-Date -Format 'yyyyMMdd'
    $QuellPfad = 'der Pfad den Du beackern möchtest'
    $ZipDatei = Join-Path -Path 'Pfad zum Verzeichnis in dem die Zip-Datei landen soll' -ChildPath ($DatumHeute + '.zip')
    
    Start-Process -FilePath zip.exe -ArgumentList "$ZipDatei $QuellPfad\*.csv $QuellPfad\*.pdf"
    Get-Date | Out-File -FilePath 'Log-Datei incl. Pfad' -Append -Encoding utf8
    Start-Process -FilePath outlook.exe -ArgumentList "/a $ZipDatei"
    

    Mit aktuellem Windows und Powershell (W10 und PS 5) könntest Du Dir das Zip-Tool auch noch sparen. Diese Funktionalität ist inzwischen eingebaut. Es wäre auch möglich die Zip-Datei aus der Powershell heraus zu versenden. Dann kannst Du das Alles per Aufgabenplanung starten und brauchst Dich in Zukunft nicht mehr manuell drum kümmern.

     

    Edit: Achja … ganz vergessen: Welche CSV-Datei soll denn dann als Quelle für Dein Datum dienen? … die Erste? … die Letzte? … die Kleinste? … die Größte? .. die Jüngste? … die Älteste? … usw.  ;-)

     

    Achso … auch noch als zusätzliche Erklärung: Ich bin jetzt mal davon ausgegangen, dass die Zip-Datei auch gleich im Zielverzeichnis erstellt werden kann. Falls das nicht möglich ist, kann man das natürlich auch noch anpassen.

  6. Für Powershell gibt es so irrsinnig viele Quellen im Internet.... , kauf Dir doch einfach ein gutes Buch oder mach einen Online-Kurs. Wenn Du erst mal die Grundlagen drauf hast, erschließt sich der Rest quasi von ganz allein.

     

    Ein sehr guter und kostenloser Einstieg könnte das hier sein:

     

    https://mva.microsoft.com/en-US/training-courses/getting-started-with-microsoft-powershell-8276

     

    ... und wenn Du mit irgendetwas nicht weiterkommst, hast Du immernoch dieses Forum hier .. und auch noch andere

  7. Ich glaub das geht einfacher:

    $OU = Choose-ADOrganizationalUnit
    $SCCMSource = Get-CimInstance -Namespace Root\SMS\Site_XXX -ClassName SMS_R_System -ComputerName XXXXXXX | Select-Object -Property Name,MacAddresses
    $ADSource = Get-ADComputer -Filter * -SearchBase $Ou.DistinguishedName | Select-Object -Property Name
    Compare-Object -ReferenceObject $SCCMSource -DifferenceObject $ADSource -Property Name -PassThru -IncludeEqual -ExcludeDifferent
    
    
  8. Machst Du bitte für ein neues Thema auch einen neuen Thread auf?

     

    Wenn Du remote auf einen anderen Computer zugreifst, siehst Du nur die "Umgebung" des Anwenders/Administrators, mit dem Du auf den remote Computer zugreifst. Dieser hat üblicherweise keine Netzwerkdrucker verbunden bzw. es wird beim remote Zugriff nicht das komplette Profile geladen in dem die Netzwerkdrucker verbunden sind.

    • Like 1
  9. Wenn Du schon mit CSV-Dateien arbeitest, solltest Du auch die cmdlets benutzen, die dafür gemacht sind. Das macht Dir das Leben leichter. Um mit den Daten einer CSV-Datei weiterzuarbeiten oder erneut zu arbeiten, ist es viel besser Import-CSV zu benutzen anstatt Get-Content. Dann arbeitest Du nicht mit "flachem" Text, sondern mit Arrays und Properties und brauchst es auch nachher nicht wieder aufwändig sortieren.


    Ich würde dann auch eher versuchen, die überflüssigen Daten soweit "vorne" wie möglich rauszufiltern … vielelicht so hier irgendwie:

    $PrinterListFileName = $env:COMPUTERNAME + ".csv"
    
    $hostAddresses = @{}
    Get-CimInstance -ClassName Win32_TCPIPPrinterPort | 
        ForEach-Object {
            $hostAddresses.Add($_.Name, $_.HostAddress)
        }
    
    $PrinterList = Get-CimInstance -ClassName Win32_Printer | 
        Where-Object {$_.Name -notmatch 'FreePDF|An OneNote|Fax|Microsoft XPS|#TYPE System.Management.Automation.PSCustomObject|Drucker-Name'} |
            ForEach-Object {
              [PSCustomObject]@{
                'Drucker-Name' = $_.Name
                'IP-Adresse' = $hostAddresses[$_.PortName]
                'Computer' = $env:COMPUTERNAME
              }
            }
    
    $PrinterList
    $PrinterList | 
        Export-Csv -Path $PrinterListFileName -Encoding UTF8 -Delimiter ';' -NoTypeInformation
    
  10. Hallo,

     

    ich fände es richtig supi, wenn Du bitte beim nächsten mal den Code auch als Code formatierst. Dann lässt er sich leichter lesen und verstehen und lange Zeilen werden im Zweifelsfall auch nicht umgebrochen.   ;)

     

    Deine Aufgabe würde ich so anfangen:

    $Path = '\\netclient273\d$\Temp'
    $Age = -30
    
    $FileList = New-Object System.Collections.Generic.List[object]
    Get-ChildItem -Path $Path -File -Recurse -Force -ErrorAction SilentlyContinue  | 
        Where-Object {$_.LastAccessTime -le (Get-Date).AddDays($Age)} |
            ForEach-Object {
                $newobj = [PSCustomObject]@{
                    Date = (Get-Date).Date
                    Name = $_.BaseName
                    Path = $_.DirectoryName
                    LastAccessTime = $_.LastAccessTime
                    Length = $_.Length
                }
                $FileList.Add($newobj)
                #Remove-Item -Path $_.FullName -Force -ErrorAction SilentlyContinue
            }
    

    Die auskommentierte Zeile solltest Du dann natürlich noch ent-auskommentieren ...   ;)

     

    Jetzt hast Du also den Ordner schon mal bereinigt und kannst dann mit den gesammelten Daten weiter verfahren, wie Du es gerne möchtest. Z.B.:

    $FileList | Format-Table -AutoSize
    

    um einfach schon mal zu gucken... oder ... 

    $FileList | Export-Csv -Path 'Pfad zu Deiner Lieblings-CSV-Datei' -Delimiter ';' -Encoding UTF8 -NoTypeInformation -Append
    

     .... oder, oder, oder ... 

  11. Hi!

    ich sehe nicht, wie die aktuell eingetragenen Benutzer (ohne sie zu kennen) geändert werden können.

     

    Ich glaub, ich habs noch nicht so ganz.  :suspect:  :schreck:  :nene:  Wenn Du sowieso Gruppen zuweisen möchtest, die dann nur lesen können sollen, wenn ich das bis dahin richtig verstanden habe, dann ist doch völlig egal, wer bis dahin irgendwelche anderen Rechte hatte. Du ersetzt ALLE bisher existierenden Rechte durch die von Dir gewünschten neuen und basta, oder? ... und das geht, wie zahni schon geschrieben hatte, mit icacls.  .... oder fehlt mir doch noch 'ne Ecke?

  12. Die unveränderte Ausgabe des Befehls Get-Process sieht aber normalerweise genauso aus, wie das was per Out-File in eine Datei exportiert wird. Versuch mal ...

    Get-Process -OutVariable Prozesse | Out-File -FilePath "C:\Users\Documents\Test2\Neu.txt" -Encoding ASCII -Width 100 ; $Prozesse
    

    Davon unabhängig kann man natürlich die Ausgabe so gestallten, dass die Informationen enthalten sind, die man haben möchte. Für strukturierte Daten bietet sich natürlich CSV oder XML viel eher an als reiner Text.

  13.  

    Kann mir jemand ein paar Tips dazu geben, wie ich da vorgehen könnte.

     

    Das kommt auf Deine Scripting-Erfahrung an und was Du dann danach mit den ausgelesenen Daten anstellen willst. Wenn es zwingend  in Excel sein soll, kommt eigentlich nur VBA in Frage. Wenn Du aber bei der "Laufzeitumgebung" flexibel bist, könntest Du auch Powershell nehmen (das würde ich favorisieren, weil ich kein VBA drauf hab  ;) ).

  14. Hmmm ...  bitte den Code als Code formatieren! Das macht uns und auch Dir das Leben leichter.   ;)

    Ich würde es so anfangen:

    $inFile = "C:\PowerTest\testinput.csv"
    $Drunter = "C:\PowerTest\out_File_Drunter.csv"
    $Drueber = "C:\PowerTest\out_File_Drueber.csv"
    $Drin = "C:\PowerTest\out_File_Drin.csv"
    
    Import-Csv -Delimiter ',' -Encoding Default -Path $inFile |
     ForEach-Object {
        If([INT]$_.Long -le 10){
            $_ | Export-Csv -Path $Drunter -Delimiter ';' -NoTypeInformation -Append
        }
        ElseIf([INT]$_.Long -gt 10 -and [INT]$_.Long -le 20){
            $_ | Export-Csv -Path $Drin -Delimiter ';' -NoTypeInformation -Append
        }
        Else{
            $_ | Export-Csv -Path $Drueber -Delimiter ';' -NoTypeInformation -Append
        }
     }
    

    ... Du wolltest ja schließlich 3 Bedingungen prüfen.

     

    Noch'n generellen Tipp: Unnötige Kommentare kannst Du weglassen. Jeder der Powershell kennt, weiß was Import-CSV macht, oder was eine Variablenzuweisung ist ... usw.

  15. Ganz einfach: Du liest die CSV-Datei ein mit Import-CSV, dann vergleichst Du die gewünschten Werte mit Deinen Vorgaben, entweder mit if oder switch und dann benutzt Du Export-CSV, um die entsprechenden Zeilen jeweils in eine eigene Datei zu schreiben.

    Was hast Du denn schon? bzw. Wo steckst Du fest?

     

    Empfehlung: Du solltest Dir die Hilfe der einzelnen cmdlets dringend komplett durchlesen, inclusive der Beispiele und dann ein wenig "rumspielen" - dabei lernt man meiner Meinung nach am besten.

  16. Ich versuche das nochmal präzise zu formulieren:

    Du möchtest also alles entfernen, was älter ist als 14 Tage und zusätzlich die eventuell noch existierenden VIB-Dateien, die älter sind als die älteste VBK-Datei die (noch) jünger ist als 14 Tage, richtig?

     

    Die zweite Möglichkeit wäre:

    Du möchtest alles entfernen, was älter ist als 14, es sei denn, die älteste Datei ist keine VBK-Datei. Dann sollen noch alle VIB-Dateien aufbewahrt werden, bis zur nächsten VBK-Datei, richtig?

     

    Beides mit Powershell kein Problem.  ;) :wink2:

  17.    Ich möchte natürlich alle zusammengehörige vIb und vbk Dateien behalten.

     

    Woran erkennt man denn zusammengehörige Dateien? ... am Namen? Wenn das eindeutig zu bestimmen ist, brauchst Du doch nur das Alter der entsprechenden "Hauptdatei" ermitteln und bei den zugehörigen Dateien nicht nach dem Alter entscheiden, sondern nach dem Namen, ob sie weg können oder nicht.

  18. Wenn Du eine Fehlermeldung bekommst, wäre es natürlich für die Fehlerbeseitigung hilfreich, zu wissen, welche Fehlermeldung Du bekommst. Für sowas reicht üblicherweise ein Einzeiler … ungefähr so:

    Get-ChildItem -Path '\\wechselplatte\Sicherung\*' -Include *.vbk,*.vib | 
        Where-Object ($_.CreationTime -lt ((Get-Date).AddDays(-14))) | 
            Remove-Item -WhatIf
    
×
×
  • Neu erstellen...