-
Gesamte Inhalte
2.098 -
Registriert seit
-
Letzter Besuch
Beiträge erstellt von BOfH_666
-
-
Da kann ich Martin nur zustimmen. Solltest Du nicht zwingend Cross-Plattform-Code produzieren müssen, fang doch einfach erstmal mit der "ganz normalen Windows Powershell" an. Die ist überall eingebaut, legt Dir am Anfang die wenigsten Hürden in den Weg und Du findest im Netz auch noch deutlich mehr Hilfe. Und die Grundlagen sind zu 99% die gleichen. Wenn Du's dann mal brauchst, ist der Umstieg dann nur noch ein kleiner Schritt.
-
Na wenigstens versuchen sie sprachlich doch schon einen Unterschied deutlich zu machen. Wenn's um die "legacy" Powershell bis Version 5.1 geht, ist jetzt immer von "Windows Powershell" die Rede, während die neue einfach nur "Powershell" heißt.
-
1
-
-
Die Weiterentwicklung von Powershell geschieht unter der Schirmherrschaft von Microsoft als Open Source. Die aktuelle stabile Version ist die Version
7.0.27.0.3, die heute released wurde. Bis Powershell Version 5.1 basiert das Ganze auf dotNet für Windows. Ab Version 6 auf dotNet-Core, welches plattformübergreifend für Windows, Mac und Linux zur Verfügung steht. Die Version 6 und folgende ist keine Nachfolge-Version im klassischen Sinn, die die Vorversion ersetzt. Windows wird auf absehbare Zeit weiter mit Version 5.1 ausgeliefert und auch weiter supportet - nur eben nicht mehr weiterentwickelt. Das heißt, neue Features landen ausschließlich in Versionen 6 und höher. Wenn Du z.B. Powershell 7 nachinstallierst, hast Du 2 unterschiedliche, voneinander unabhängige Powershells auf dem Rechner.-
1
-
-
Cool. Danke für den Link.
-
vor 1 Stunde schrieb Nobbyaushb:
Wer bitte installiert Office in 64 bit?
Jeder, der keine Abhängigkeiten zu alten legacy 32-Bit Plugins/AddOns hat, oder?
Was spräche noch dagegen?
-
Weil's mich selber interessiert hat ...
Hier mal eine Version, die statt des Outlook-Com-Objekts Send-MailMessage benutzt und deshalb auch ohne installiertes Outlook funktionieren würde. ... z.B. vom Server
Ich würde auch eher UNC-Pfade als Laufwerksbuchstaben empfehlen. Also \\Servername\Freigabe anstatt x:\.
$maxAttachmentSize = 20MB $directory = 'x:\TIFF zum einlesen Scanntool' $Filter = '*GEKO*.tif' $mailText = Get-Content -Path 'X:\Textvorlagen\skoda-sekretariat.txt' $fileList = [System.Collections.ArrayList](Get-ChildItem -Path $directory -Filter $Filter | Sort-Object -Property Length -Descending ) $attachmentListList = [System.Collections.ArrayList]@() while ($fileList.count -gt 0) { $attachmentList = [System.Collections.ArrayList]@() while (($attachmentList.Length + $fileList[0].Length | Measure-Object -Sum).Sum -lt $maxAttachmentSize -and $fileList.count -gt 0) { [VOID]$attachmentList.add($fileList[0]) [VOID]$fileList.RemoveAt(0) } $index = 1 while ($fileList.count -gt $index ) { if (($attachmentList.Length + $fileList[$index].Length | Measure-Object -Sum).Sum -le $maxAttachmentSize ) { [VOID]$attachmentList.add($fileList[$index]) [VOID]$fileList.RemoveAt($index) } $index ++ } [VOID]$attachmentListList.Add($attachmentList) } foreach ($list in $attachmentListList) { $SendMailMessageParams = @{ From = 'absender@absender.de' To = 'empfaenger@empfaenger.de' Subject = 'Scan Antraege fuer Archiv' Body = $mailText Attachments = $list.FullName SmtpServer = 'smtp.absender.de' } Send-MailMessage @SendMailMessageParams }
Bei der maximalen Attachment-Größe musst Du Dich evtl. herantasten weil die Gesamtgröße der Dateien für eine Mail immer ein bissl über der eingestellten Größe liegt (je nach Größe der zuletzt hinzugefügten Datei).
Achja ... die "Verschiebe-Aktion" der Dateien in das Archiv-Verzeichnis kannst Du dann hinterher natürlich immernoch machen wenn gewünscht.
EDIT:
Ich hab die innere While-Schleife nochmal geändert. Die Summe der Dateigrößen in einer einzelnen "$attachmentList" ist jetzt auf jeden Fall kleiner oder gleich der eingestellten Maximalgröße.
EDIT 2:
Ich hab den Code nochmal ein bissl gepimpt. Jetzt wird die angegebene Maximalgröße optimal ausgenutzt. Das kann - je nach Datei-Anzahl- und Größe - die Anzahl der versendeten Mails reduzieren.
-
vor einer Stunde schrieb daabm:
Die schlechteste aller Skripting-Code Varianten - sorry... Filtern immer so weit links wie möglich, und Get-ADUser hat nen -LDAPFilter, dann filtert schon der DC und liefert nicht sinnloserweise alle User zurück...
Nicht jeder ist in globalen verteilten AD-Strukturen mit 10.000-den von User-Objekten unterwegs oder so. Und wenn der Code nicht alle 30 Sekunden laufen soll, dann ist es meiner Meinung auch mal egal, ob das dann der effizienteste Code der Welt ist oder nicht. Für einen LDAP-Filter müsste ich "nachschlagen" - das fließt mir nicht aus den Fingern. Die Syntax von ober klimper ich einfach runter und das Ergebnis ist am Ende des Tages das gleiche. Der Aufwand wäre für mich also deutlich höher, ohne mir einen spürbaren Mehrwert zu liefern.
-
vor 18 Minuten schrieb NilsK:
wäre es nicht schlauer, das eigentliche Filterkriterium (Mail ist leer) gleich in den Filter-Parameter des Get-ADUser-Cmdlets aufzunehmen?
Wäre es. Definitiv. Da man aber dem Parameter -Filter keine komplexen Script-Blöcke, sondern nur einen "Filter-String" mitgeben kann, kenne ich keine funktionierende Syntax, wie man auf ein leeres Attribut filtern kann. Und meine LDAP-Kenntnisse sind leider auch quasi nicht vorhanden.
-
Ich würd' eher eine CSV-Datei empfehlen. Die eignet sich besser für strukturierte Daten:
Get-ADUser -Filter "enabled -eq '$true'" -Properties Mail -SearchBase 'OU=Verwaltung,OU=Anwender,DC=contoso,DC=com' | Where-Object {$null -eq $_.Mail} | Select-Object -Property *Name*,Mail | Export-Csv -Path 'Pfad zur CSV-Datei.csv' -NoTypeInformation
Wenn Du unbedingt eine Text-Datei haben möchtest, pickst Du Dir einfach mit dem Select-Object den Namen raus, den Du exportieren möchtest und nimmst Out-File anstatt Export-CSV. (Ich habe hier das Attribut "Mail" nochmal mit in die Ausgabe eingeschlossen, um eine "visuelle Bestätigung des Fehlens" zu erhalten)
-
Hmmm ... ich bin ein bissl verwirrt. Du sammelst tif-Dateien ein, nennst die Variable aber $pdfs!?
In Deiner foreach-Schleife benutzt Du eine Variable $tifBaseName, die aber vorher nicht definiert wird. Erst benutzt Du einmal Join-Path, um einen korrekten Pfad zu erstellen und dann wieder bastelst Du mittels String-Verkettung Pfade zusammen.
Wenn Du Fehlermeldungen erhältst, poste diese doch bitte komplett (auch als Code formatiert bitte).
-
vor einer Stunde schrieb thomas1972:
Ja sind Sie, sollten die Anhänge mal grösser sein, kann ich anhand der Variable die Anzahl noch selbst anpassen
Wenn Du schon automatisierst, dann richtig. Was ist das Maximum, was Du per Mail versenden darfst / der Empfänger empfangen darf?
vor einer Stunde schrieb thomas1972:Leider nein, da die Daten extern verarbeitet werden, ist außer per Mail, kein anderer Austausch möglich. :-(
Wie unprofessionell ...
.... na dann los ... wir helfen Dir.
Ich vermute mal, dass Du wenigstens die Grundkenntnisse in Powershell bereits erworben hast - jedenfalls lässt das Deine früher hier gestellte Frage vermuten. Viele Sachen sind in Powershell deutlich einfacher als in VBS. Wie würdest Du anfangen?
-
vor 51 Minuten schrieb NilsK:
fernab der Funktion erlaube ich mir die Off-Topic-Anmerkung, dass die Vergangenheit (bzw. genauer das Past Participle) von "split" ebenfalls "split" ist, nicht "splitted".
Ich werde das demnächst "eindeutschen". Dann wird die Intention noch deutlicher.
-
1
-
1
-
-
vor 4 Stunden schrieb thomas1972:
Hallo, ich muss ein bestehendes VBA Script in PowerShell umsetzen,
leider habe ich keine Möglichkeit gefunden, dieses über Tools zu realisieren.
Dafür gibt es keine Tools, weil es keinen Sinn macht, VBS-Befehle 1 zu 1 in Powershell zu "übersetzen".
vor 1 Minute schrieb thomas1972:.... nur wird VBA nicht mehrlässig sein
was heißt das?
vor 1 Minute schrieb thomas1972:und ich muss den Umweg über Powershell gehen.
Powershell ist doch kein Umweg!!
vor 2 Minuten schrieb thomas1972:(jeweils mit maximal 30 Elementen)
... sind 30 Elemente garantiert immer so "klein", dass es auch möglich ist, sie per Anhang mit einer Mail zu vesenden?
vor 5 Minuten schrieb thomas1972:Es soll im Verzeichnis C:\temp\Geko Anträge alle Anhänge in einer Mail versenden,
Wäre nicht ein Upload auf einen geschützten Ablage-Ort und eine passende Info-Mail der professionellere Weg?
-
vor 20 Minuten schrieb driverx:
Hättest Du einen möglichen Skript zur Hand...?
Da ich die konkreten Anforderungen nicht kenne - nope. Aber um einen Wert aus einem AD-Attribut in ein anderes zu verschieben/kopieren, genügen Powershell-Anfänger-Kenntnisse. Wenn man das nicht from Scratch selber machen möchte, gibt es im Netz - gefühlt - tausende Beispiele, die man an die eigenen Bedürfnisse anpassen kann.
-
vor 1 Minute schrieb driverx:
Die Frage hat sich klar auf das AD bezogen und nicht auf die Zusatz-Software...
Du kannst Dir gar nicht vorstellen, wie oft in Foren jemand eine konkrete Frage stellt und einen Lösungsweg im Hinterkopf hat, der sich dann aber als absoluter Holzweg oder wenigstens sub-optimal herausstellt.
... und wie oben schon erwähnt - wenn Du die benutzte Telefonnummer in ein anderes Attribut packen könnt, ist das mit Powershell z.B. sehr einfach zu scripten, die existierenden Nummern in dieses Attribut zu übertragen.
-
Gerade eben schrieb driverx:
Leider bedeutet das aber, dass ich im AD alle anpassen muss...
Scheint aber die passabelste Lösung zu sein.
Das lässt sich aber relativ einfach scripten.
Gerade eben schrieb driverx:SMS Passcode von Entrust Datacard
OK. Entschuldige bitte. Ich bin bisher davon ausgegangen, dass wir hier von Exchange Online reden. Dann sind meine Einwände natürlich falsch. Aber mit einem Hinweis in Deinem ersten Beitrag, um welche Lösung es sich handelt, wäre das nicht passiert.
-
vor 11 Minuten schrieb driverx:
Ich bitte EUCH nochmals, das Thema im Auge zu behalten...
Wollte ich was ändern, hätte ich euch nach alternativen gefragt...
Aber wenn ich Dich richtig verstandnen habe, willst Du doch etwas ändern!?
... vielleicht nimmst Du Dir nochmal einen Moment und versucht mal über Deinen Tellerrand hinauszudenken. Vielleicht ist es ja besser, einfach etwas anderes zu ändern als Du dachtest!?!?!
ZitatIm Moment ist diese Lösung etabliert und alle kennen den Vorgang.
Wie schon weiter oben geschrieben - das muss nicht heißen, dass das bis in alle Ewigkeit so bleiben muss und auch die beste Lösung ist.
ZitatAusnahme, Euer Budget gibt noch soviel her, um für UNS eine neue Variante zu evaluieren, prüfen, entscheiden, kaufen, implementieren, testen, ausrollen....
... das ist nur zu implementieren - von Microsofts Seite entstehen da keine Extra-Kosten.
ZitatAber das ist soweit weg von Lösungsorientiert.... wie wenn ihr einem VW Fahrer der über "laute Geräusche aus dem Heck" klagt, sagt, warum kaufst Du Dir nicht ein AUDI???
Das sehe ich ganz anders. Wenn ein verfügbares Audi-Erstzteil das Problem des VW-Fahrers löst (was im Übrigen gar nicht soo weit hergeholt ist), wird er damit sehr glücklich sein. Und wenn sein Wagen dadurch noch einfacher zu handhaben ist, wird er sich fragen, warum ihm seine Werkstatt das nicht fürher angeboten hat.
-
Gerade eben schrieb driverx:
WIE die "Multifaktor-Authentifizierung" ausgeführt wird ist schon seit Jahren gelöst und so auch schon lange in Betrieb ... und wird auch so für gut befunden.
..... und dann muss das für die Ewigkeit so bleiben? Gelegentlich kann es hilfreich sein, wenn man eingetretene Pfade verlässt. Deine Anwender werden begeistert sein, wenn sie nicht mehr eine Nummer ablesen und eintippen müssen sondern nur noch auf dem Handy einen Button antippen müssen, um sich anzumelden.
-
Die Microsoft-Authenticator App ist meiner Meinung nach sehr empfehlenswert.
-
Thomas,
willkommen im MCSEboard.
Wenn ich alles richtig verstanden habe, sollte es so funktionieren:
$tool = 'C:\Sicherung_Stick\Tools\ghostscript\bin\gswin64c.exe' $inputDir = 'X:\513214\7. Scan Posteingang' $outputDirPDF = 'X:\513214\7. Scan Posteingang\ERLEDIGT' $outputDir = 'X:\513214\TIFF zum einlesen' $pdfs = Get-ChildItem -Path $inputDir -Recurse -Filter 'x*.pdf' foreach ($pdf in $pdfs) { $splittedBaseName = $pdf.BaseName -split '_' $tifBaseName = $pdf.LastWriteTime.ToString('yyyyMMdd') + '_' + $splittedBaseName[0].TrimStart('x') + '_prüfung_' + ($splittedBaseName[1..2] -join '_') $tif = Join-Path -Path $outputDir -ChildPath ($tifBaseName + '.tif') $pdf_to_move = $inputDir + $pdf.BaseName + ".pdf" if (Test-Path -Path $tif) { "tif file already exists $tif" } else { "Processing $($pdf.Name)" $param = "-sOutputFile=$tif" & $tool -q -sPageList=1 -dNOPAUSE -sDEVICE=tiffg4 $param -r600 $pdf.FullName -c quit } Move-Item $pdf_to_move $outputDirPDF }
-
Sorry ... das war auch eigentlich nur ironisch gemeint.
-
vor 1 Minute schrieb NilsK:
Geht aber in der Tat nicht. (Auch wenn es SID heißt.)
..... und ich hatte schon einen Moment überlegt ...
... der neue Server bringt ja seine lokalen Gruppen auch schon mit ... jedenfalls die, die eben alle Server mitbringen.
-
vor 3 Minuten schrieb remus25:
wie kann ich die Lokalen Gruppen inkl. SSID vom 2008 Server auf den 2019 kopieren ?
Warum würde man das tun wollen?
-
Oh, super. Gibt's hier jetzt ein Freitags-Rant?
... da fällt mir auch noch das ein oder andere ein ... aber nicht unbedingt nur zu Windows 10 ....
Auto BackUp mit Verschlüsselter HDD
in Windows Forum — Scripting
Geschrieben · bearbeitet von BOfH_666
Geht es dabei um eine externe HDD? Wohin soll gesichert werden? In den "Pro-Versionen" von Windows 10 gibt es die Shadow-Copies. Die helfen schon relativ häufig weiter.
Dann wäre bestimmt sowieso ein automatisch gestartetes Backup besser als ein manuell per Doppelklick gestartetes, oder? Und bei einem eventuell nötigen Restore wirst Du vermutlich auch sowieso helfen müssen, richtig?
Ich nutze für meine "Privat-Patienten" gern Duplicati2 und bin bisher sehr zufrieden damit. Man kann "lokale" Backup-Ziele benutzen oder auch viele Online-Speicher (natürlich verschlüsselt).