Jump to content

BOfH_666

Expert Member
  • Posts

    1,797
  • Joined

  • Last visited

Community Answers

  1. BOfH_666's post in Wie kann ich die Zoom Leiste aus MS Edge im IE Mode entfernen? was marked as the answer   
    Ist es möglich, dass das keine "Zoom Leiste" ist sondern eine "Status Leiste"?  ... dann könntest Du danach suchen, wie man die Status-Leiste deaktiviert.   
  2. BOfH_666's post in Powershell Ausgabe was marked as the answer   
    Tim,
    Willkommen im MCSEboard.
     
     
    Und warum schreibst Du dann eine einfache Text-Datei? Export-Csv wäre dann wohl besser geeignet. 
     
     
    Im einfachsten Fall startest Du das Script im gewünschten Verzeichnis und dann sollte so etwas hier genügen:
    Get-ChildItem | Get-FileHash | Export-Csv -Path 'C:\temp\HashList.csv' -NoTypeInformation  
  3. BOfH_666's post in Mehrere .csv Dateien mit Powershell bearbeiten uns speichern was marked as the answer   
    Im einfaschte Fall sollte es das hier bringen:
    $folder_csv = 'C:\Install\Import' $fileList = Get-ChildItem -Path $folder_csv -Filter *.csv -File foreach ($file in $fileList) { $NewContent = Get-Content $file.FullName | Select-Object -Skip 1 $NewContent | Out-File -FilePath $file.FullName -Force }  
  4. BOfH_666's post in ACLs auslesen was marked as the answer   
    Was für ein nachlässig geschriebener PowerShell-Code ....  
     
    "dir" ist ein PowerShell-Alias für Get-ChildItem. der Parameter -Directory teilt Get-ChildItem mit, dass es ausschließlich Verzeichnisse auflisten soll. Wenn Du auch Dateien angezeigt haben möchtest, musst Du den also weglassen. Haben wirklich einzelne Dateien separat gepflegte Berechtigungen?
  5. BOfH_666's post in Batch um Dateien in Ordner mit Teil des Dateinamen zu verschieben was marked as the answer   
    Wo buddelt ihr nur immer wieder so alten Sch**ß aus ... nimm Powershell:
    $Quellverzeichnis = 'C:\sample\Quelle' $Zielverzeichnis = 'C:\sample\Ziel' Get-ChildItem -Path $Quellverzeichnis -Filter *.pdf -File | ForEach-Object{ $Name = ($_.BaseName -split '_')[2] $Ziel = Join-Path -Path $Zielverzeichnis -ChildPath $Name if (-not (Test-Path -Path $Ziel)) { New-Item -Path $Ziel -ItemType Directory | Out-Null } Move-Item -Path $_.FullName -Destination $Ziel }  
  6. BOfH_666's post in If Exist Value in CSV Datei was marked as the answer   
    Es wär natürlich ne gute Idee, nicht nach "X" zu fragen, wenn Du eigentlich "Y" wissen willst.  
     
     
    Wenn Du in der Spalte mit den Gruppen/Berechtigungen mehrere durch Trennzeichen getrennte Einträge drin hast, kannst Du die mittels "-split" in ein Array aufspalten und dann mit einer Schleife über dieses Array "drüber-iterieren".    ... da brauchst Du keine 100 if's untereinanderzupacken.
     
    Edit:
     
    also sowas hier:
    $CSVInput = @' user,gruppen max.mustermann,"test1,test2,test3,test4,test5,test6" frau.mustermann,"test1,test2,test,3,test4" '@ | ConvertFrom-Csv -Delimiter ',' foreach ($Item in $CSVInput) { $GruppenListe = $Item.gruppen -split ',' foreach ($Gruppe in $GruppenListe) { [PSCustomObject]@{ User = $Item.User Gruppe = $Gruppe } } }  
  7. BOfH_666's post in Powershell Script loop was marked as the answer   
    hmmm ... Dein Code is syntaktisch falsch oder unvollständig ... ich hoffe mal, dass das nur beim hierher Kopieren passiert ist.   
     
    # Import active directory module for running AD cmdlets Import-Module activedirectory Das ist überflüssig. Seit PowerShell Version 3 werden korrekt installierte Module automatisch geladen.  Das Einzige, was vielleicht Sinn machen würde wäre...
     
    #Requires -Modules ActiveDirectory  
    ... 
     
    $users = Get-ADUser -F {Office -eq "group1" -or Office -eq "group2" -or Office -eq "group3"}  
    Vermutlich wird mich gleich wieder jemand korrigieren und sagen, dass das mit LDAP-Filter überhaupt kein Problem ist, aber meiner Meinung nach ist es bei komplexen Bedingungen häufig einfacher, die Filterung mit einem Where-Object zu erledigen. Du könntest also hiermit
    $users = Get-ADUser -SearchBase 'whatever fits to your environment' | Where-Object { $_.Office -in $ADUsers.Office} ... die gewünschten AD-Konten ermitteln.
  8. BOfH_666's post in Script - Ordner liegt länger als 5 Minuten im Verzeichnis was marked as the answer   
    Nur um es nicht falsch verstanden zu haben: Du suchst nach Ordnern, oder?
    Warum dann ...
    $_.psIsContainer -eq $false  ... ?
    Und wenn ich mich nicht irre, wird die Eigenschaft "LastWriteTime" eines Ordners von der aktuellsten "LastWriteTime" der im Ordner enthaltenen Dateien bestimmt. Das hieße, wenn in dem Ordner laufend neue Dateien geschrieben werden, ändert sich auch permanent die "LastWriteTime" des Ordners.
     
    Übrigens: Seit PowerShell Version 3 kennt das cmdlet Get-ChildItem die Parameter -File und -Directory, um die Suche auf Dateien oder Ordner zu beschränken.  
  9. BOfH_666's post in Gesendet Elemente bei shared Mailboxen was marked as the answer   
    Das ist der Standard, wenn man sich die Mailbox korrekt in Outlook einrichtet.    .... nicht als Option "weiteres Postfach" zum eigenen Postfach, sondern als eigenständiges Postfach NEBEN seinem eigenen Postfach.   
  10. BOfH_666's post in Batch - Datei zum Kopieren von Dateien nach Installation was marked as the answer   
    Deshalb glaube ich, dass es einfacher für Dich wäre, wenn Du gar nicht mehr mit Batch anfängst, sondern Dich gleich auf PowerShell stürzt.  Die Syntax ist deutlich konsistenter und - wie ich finde - viel einfacher zu erlernen und man findet auch deutlich mehr Hilfe im Netz.
     
     
    Du solltest keinen Code benutzen, den Du nicht verstehst.
     
    Der eigentlich relevante Code ist das hier:
    start /wait "Installation Programm" "F:\xxx\yyy.exe" if exist %C:\Program Files (x86)\xxx\yyy.EXE% ( xcopy "%cd%\Datei.exe" "C:\Program Files (x86)\xxx" /y /q )  
    In Batch werden Variablen in Prozentzeichen eingeschlossen. Der Pfad in Deiner if-Anweisung steht komplett in Prozentzeichen.
     
    Angenommen, dass das Skript im gleichen Ordner liegt, wie die Installationsdatei und die Updatedatei würde das Ganze in PowerShell ungefähr so aussehen:
    & "$PSScriptRoot\yyy.exe" if (Test-Path -Path 'C:\Program Files (x86)\xxx\yyy.EXE') { Copy-Item -Path "$PSScriptRoot\UpdateDatei.exe" -Destination 'C:\Program Files (x86)\xxx' }  
    Ich glaube, selbst für jemanden ohne Kenntnisse, ist der Code ziemlich einfach zu lesen und zu verstehen.   
  11. BOfH_666's post in Zwei Spalten vergleichen bzw. Inhalte löschen was marked as the answer   
    Erscheint mir irgendwie redundant.  
     
    Aber egal ...  Du sammelst Dir einfach alle AD User ein
    $allADUserList = Get-ADUser -Filter * -SearchBase 'OU=Germany,DC=contoso,DC=de' Dann holst Du Dir die Gruppenmitglieder
    $DarfSurfen = Get-ADGroupMember -Identity 'DarfSurfen' Und dann vergleichst Du die 
    Compare-Object -ReferenceObject $allADuserList -DifferenceObject $DarfSurfen -Property DistinguishedName Was übrig bleibt, packst Du in die andere Gruppe.
  12. BOfH_666's post in WLAN QR Code mit Word erstellen? was marked as the answer   
    Hmmm ... ne kurze Suche findet das hier:
     
    https://www.qr-code-generator.com/solutions/wifi-qr-code/
     
    .. .wenn man 4/5 nach unten scrollt, findet man das hier:
     

     
    ... das müsste eigentlich genügen, oder? 
  13. BOfH_666's post in WIM Update integrieren, Fehler 0x800f0823 was marked as the answer   
    Na soo wahnsinnig kryptisch ist das dism.log nun auch wieder nicht. Ich tippe mal ins Blaue und sage, dass Deine Probleme spätestens in Zeile 265 beginnen. Dein Servicing Stack ist nicht aktuell genug. Da wirst Du vermutlich noch weitere Updates vorher integrieren müssen. Ich kann Dir aber nicht sagen, welche - ich habe damit leider auch keine Erfahrungen, sorry.
  14. BOfH_666's post in get-service mit "Log on As" was marked as the answer   
    Eine kurze Google Suche nach "powershell get-service log on as" bringt bei mir als ersten Treffer das hier: https://devblogs.microsoft.com/scripting/the-scripting-wife-uses-powershell-to-find-service-accounts/
     
    Get-Service bringt Dich in diesem Fall also nicht weiter ... aber Get-CimInstance tut's ...
    Get-CimInstance -ClassName Win32_Service | Select-Object -Property Name, StartMode, StartName  
  15. BOfH_666's post in PowerShell Array auslesen und abgleichen was marked as the answer   
    OK. Tust Du mir bitte einen Gefallen und führst mal bitte den folgenden Code aus ... so wie er ist - nur mit Deinen Variablen?
     
    $SourceACL = Get-Acl $Quelle | Select-Object -ExpandProperty Access $TargetACL = Get-Acl "\\$TargetServer\$Type\$Folder" | Select-Object -ExpandProperty Access Compare-Object -ReferenceObject $SourceACL -DifferenceObject $TargetACL -Property IdentityReference, FileSystemRights -IncludeEqual Was erhältst Du als Ausgabe? ... ich gehe davon aus, dass Du ein paar Zeilen mit den Titeln IdentityReference, FileSystemRights und SideIndicator erhältst, richtig? Du hast also MEHRERE Zeilen mit dem gleichen Ergebnis. Und das versuchst Du mittels -eq '==' zu vergleichen. Das kann nicht zuverlässig funktionieren.  Und wenn es doch funktioniert, kannst Du dem Ergebnis nicht vertrauen. Wenn Du das -IncludeEqual weglässt, erhältst Du nur noch die Unterschiede - was Du ja möchtest. Und wenn es keine Unterschiede gibt, wird auch keine Ausgabe erzeugt. 
  16. BOfH_666's post in Skript für Ordnerstruktur teilweise kopieren was marked as the answer   
    Nee ... wir werden doch jetzt nicht anfangen, Pfade oder Laufwerksbuchstaben im Code hart zu verdrahten ...   ich hätte vielleicht dazusagen sollen: "Pfoten weg von meinem Code! "    ... nicht meinen Code anpassen - eigenen ergänzen.    
    Dieser Teil hier:
    $QuellPfad = 'C:\Quelle\Desktop\Kopier-Skript\Test\Quelle' $ZielPfad = 'C:\Ziel\Desktop\Kopier-Skript\Test\Ziel' $OrdnerSuchMuster = '\\B\d{2}_' $PotenzielleBackupOrdnerListe = Get-ChildItem -Path $QuellPfad -Directory -Recurse | Where-Object { $_.FullName -match $OrdnerSuchMuster } | ForEach-Object { $DateiSuchMuster = Join-Path -Path $_.FullName -ChildPath '*.pdf' if (Test-Path -Path $DateiSuchMuster) { [PSCustomObject]@{ FullName = $_.FullName ShortName = $_.FullName -replace [REGEX]::Escape($QuellPfad) } } } ... war doch nur dazu da, zu zeigen, wie man die zu kopierenden Ordner ermittelt und die Pfade entsprechend aufbereitet. Die damit erzeugte Liste $PotenzielleBackupOrdnerListe können wir dazu benutzen, den Zielpfad zusammenzubauen und den Copy-Job anzustoßen:
    foreach ($PotenzielleBackupOrdner in $PotenzielleBackupOrdnerListe) { $KopierZielPfad = Join-Path -Path $ZielPfad -ChildPath $PotenzielleBackupOrdner.ShortName "Quelle : '$($PotenzielleBackupOrdner.FullName)' - Ziel: '$($KopierZielPfad)'" # Robocopy.exe $PotenzielleBackupOrdner.FullName $KopierZielPfad *.pdf } Die robocopy-Zeile ist noch auskommentiert. Wenn Du geprüft hast, ob die ausgegebenen Pfade zu Deinen Anforderungen passen, kannst Du das "#" vor robocopy entfernen.  ... trotzdem nochmal mit Test-Daten und Test-Pfaden testen bitte!! 
    Wenn dann mit den Test-Daten alles wie gewünscht funktioniert, brauchst Du nur noch die Variablenzuweisungen vom Anfang des Codes anpassen und es passt auch für die produktiven Daten.
     
    Doch, aber dann musst Du diesen auch angeben. Wie Martin schon erwähnte, ist $PotenzielleBackupOrdnerListe ein Array von Objekten mit Eigenschaften. Es gäbe zwar Möglichkeiten, das so zu bauen, dass sich Copy-Item die richtige Eigenschaft aus dem Object rauspickt, aber wir wollen ja sowieso robocopy benutzen. Und das kann damit eben nicht umgehen. Also müssen wir die entsprechende Eigenschaft der Objekte explizit angeben.
     
    Du hattest erwähnt, dass Du Dich näher mit dem Thema Scripting befassen möchtest. Das ist mit Sicherheit eine sehr gute Idee. Du solltest Dir ein bissl Zeit nehmen, um Dir die Grundlagen von Powershell draufzuschaffen. 
    Ein guter Einstieg, wie ich finde, ist immernoch der Video-Kurs mit Jeffrey Snover: Getting Started with Powershell. Und wenn Du was zum Nachschlagen brauchst, kannst Du Dir das hier anschauen: Windows PowerShell™ 4: TFM.  ... beides kostenlos. 
  17. BOfH_666's post in Script Problem, Suche aller PST Dateien auf Client mit anschließendem umbenennen was marked as the answer   
    Das sollte nur ein Spaß sein ... ich hatte das schon so verstanden. 
    Die Aufgabe klingt danach, als würdest Du wenigstens gelegentlich davon profitieren, wenigstens Basis-Kenntnisse im Scripten zu haben. Ich kann Dir nur empfehlen, Dir die Grundlagen von Powershell anzueignen. Es würde sich auf jeden Fall für Dich lohnen.  ... und es ist nicht schwer.   
     
    Mit dem folgenden Schnipsel würdest Du z.B. auf allen lokalen Laufwerken nach *.PST-Dateien suchen und diese dann jeweils nach C:\Users kopieren. Man könnte sie natürlich auch gleich verschieben.
    $LocalDriveList = (Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}).DeviceID | ForEach-Object {"{0}\" -f $_} Get-ChildItem -Path $LocalDriveList -Filter *.pst -Recurse -Force -ErrorAction SilentlyContinue | ForEach-Object { $NewName = $Env:COMPUTERNAME + '_' + $Env:USERNAME + '_' + ($_.FullName -replace ':' -replace '\\','_') $Destination = Join-Path -Path C:\Users -ChildPath $NewName Copy-Item -Path $_.FullName -Destination $Destination } Dabei setzen sich die neuen Namen am neuen Ablageort aus dem Computernamen, dem Usernamen und dem ursprünglichen Pfad zusammen. So ist eine Zuordnung möglich und man kann sogar nachvollziehen, wo die Dateien ursprünglich gelegen haben.
  18. BOfH_666's post in Powershell foreach-object was marked as the answer   
    $Array1 = @' Nummer,Produkt 1,Produkt1 2,Produkt2 3,Produkt3 4,Produkt1 5,Produkt2 6,Produkt3 7,Produkt1 8,Produkt2 9,Produkt3 '@ | ConvertFrom-Csv $array2 = $array1 | where-object { $_.produkt -match 'produkt1' } | Select-Object -Property * $array3 = $array1 | where-object { $_.produkt -match 'produkt1' -or $_.produkt -match 'produkt2' } | Select-Object -Property * $array3 | foreach-object { $_.produkt = 'TEST' } $Array1 $array2 $array3 Ergibt das das erwartete Ergebnis?
  19. BOfH_666's post in Verzeichnisname ist ungültig was marked as the answer   
    Du machst es Dir aber auch schwer ...
    $CimSession = New-CimSession -ComputerName 'Print01' -Credential $Credentials Get-CimInstance -CimSession $CimSession -ClassName Win32_Printer | Select-Object -Property ShareName | Out-File C:\Drucker\Printer_List.txt Remove-CimSession -CimSession $CimSession Um die Probleme zu umgehen, dass es quasi keine einfache Möglichkeit gibt, Credentials sicher für die Benutzung in Scripten zu speichern, könntest Du einfach die Aufgabenplanung benutzen. Du erstellst eine entsprechende Aufgabe mit den nötigen Anmeldedaten und führst diese bei Bedarf aus. Dann lässt Du den ganzen Credentials-Kram im Script einfach weg.
  20. BOfH_666's post in Problem mit einem PowerShell-Objekt was marked as the answer   
    Hmmm ... verstehe ich das richtig - diese beiden Zeilen
    $result = Invoke-RestMethod -Method Get -Uri $url -ContentType "application/json ; charset=utf-8" -Headers $header -DisableKeepAlive $result = $result | Select-Object -ExpandProperty attr -Property URL erzeugen also ein Objekt mit den Properties "ip","prefixLen" und "url"?   
     
    Wenn dem so ist, ist eine einfache Möglichkeit, eine weitere Property hinzuzufügen, eine sogenannte "calculated property" zu verwenden (erklärt in der Hilfe zu Select-Object Example #10).  Um bei Deinem Beispiel mit dem Zufall zu bleiben ....
    $result = $result | Select-Object -ExpandProperty attr -Property URL, @{Name = 'ID'; Expression = { get-random -Minimum 1 -Maximum 100}} Ein besseres Beispiel ist vermutlich sowas hier: 
    $result = $result | Select-Object -ExpandProperty attr -Property URL, @{Name = 'capitalizedURL'; Expression = { $($_.URL).toUpper()}} Du benutzt also einfach das aktuelle Pipeline-Element ($_), um damit in einem Scriptblock etwas anzustellen. Wenn's was komplexeres sein soll, lohnt sich's vermutlich, vorher dafür eine entsprechende Funktion zu bauen.
  21. BOfH_666's post in Powershell User anlegen; Gruppe hinzufügen was marked as the answer   
    Du kannst den Befehl New-ADUser mit dem Parameter -PassThru auf rufen und das Ergebnis einer Variablen zuweisen. Mit dieser Kannst Du dann die Gruppenzuweisung durchführen. Oder Du pipe'st das Ganze einfach an Add-LocalGroupMember weiter.
     
    Bist Du sicher, dass Du Add-LocalGroupMember meinst?  Sollte das nicht besser Add-ADGroupMember sein?
  22. BOfH_666's post in Textdatei zeilenweise zerlegen was marked as the answer   
    Ich habe Deine Logik nicht ganz verstanden, aber hier einfach ein paar generelle Hinweise. Wenn Deine Daten quasi CSV-Daten sind, machst Du Dir das Leben einfacher, wenn Du sie auch so behandelst.
    $SourceData = @' 0200 A510158 Hauptsatz1 0300 A510158 Nebensatz1 0300 A510158 Nebensatz2 '@ | ConvertFrom-Csv -Header STZ,Index,Auftrag -Delimiter ' ' $SourceData $SourceData | Group-Object -Property STZ $SourceData | Group-Object -Property Auftrag Ich hab jetzt einfach mal das Leerzeichen als Trenner angenommen. Wenn die Daten als "Tabelle" vorliegen, dann hast Du mit Powershell vielfältige Möglichkeiten mit den Daten zu "jonglieren". Hier oben z.B. hab ich die Daten einfach mal nach verschiedenen Attributen gruppiert ...
     
    Fragen? Fragen! 
  23. BOfH_666's post in Powershell Skript zum Löschen von Dateien die älter sind als X Tage was marked as the answer   
    Wir (Powershell)-Scripter schreiben nicht so gern code doppelt und dreifach. Dafür gibt es Arrays und Schleifen. Hier mal ein Beispiel, der von Deinem Code "inspiriert" wurde. Der Muss selbstverständlich noch angepasst werden.
    $ComputerNameList = (Get-ADComputer -Filter Name -like 'COMPUTER').Name $DirectoryList = @( 'C:\xxx\xxx1' 'C:\xxx\xxx2' 'C:\xxx\xxx3' ) $10DaysBefore = (Get-Date).AddDays(-10) $30DaysBefore = (Get-Date).AddDays(-30) foreach ($ComputerName in $ComputerNameList) { if (Test-Connection -ComputerName $ComputerName -Quiet -Count 1) { Invoke-Command -ComputerName $ComputerName { foreach ($Directory in $DirectoryList) { Get-ChildItem -Path $DirectoryList -Include *.bat, *.cat, *.txt, *.ini, *.zip, *.pdf, *.log -Recurse -Force -File | Where-Object { $_.LastWriteTime -lt $10DaysBefore } | Remove-Item -Force } } } } Wie Du siehst, ist keine CodeZeile doppelt vorhanden. Das macht den Code deutlich leichter zu lesen, zu debuggen falls nötig und auch leichter zu erweitern, falls gewünscht.    Wenn Du z.B. ein weiteres Verzeichnis behandeln möchtest, fügst Du einfach ein weiteres Verzeichnis dem Array $DirectoryList hinzu.
     
    Fragen? Fragen!    
     
    Edit: Achja ... noch vergessen ... der Code dürfte auch so deutlich schneller laufen, da Du die Dateien nicht über die administrativen Freigaben löschen musst, sondern quasi lokal unterwegs bist. 
  24. BOfH_666's post in PS New-ADUser Frage zu -Name und -Samaccountname was marked as the answer   
    Kurze Antwort: Das ist soweit richtig.  
  25. BOfH_666's post in Passendes Forum für WPF/XAML was marked as the answer   
    Ich bin mir ziemlich sicher, dass es hier auch Kollegen gibt, die sich mit dem Thema gut auskennen. Ein dediziertes WPF/XAML Forum kenn ich nicht, aber ich weiß, dass im deutschen und auch im englischen Microsoft Technet Powershell Forum gelegentlich danach gefragt wird und üblicherweise auch hilfreiche Antworten gegeben werden. StackOverflow ist auch immer eine gute Adresse.  Bei allen Foren bitte - die Hinweise für Newbies lesen! 
×
×
  • Create New...