Jump to content

MurdocX

Moderators
  • Gesamte Inhalte

    2.752
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von MurdocX

  1. Wir setzen auf RemoteAPP in unserem MS-Umfeld. Nutzer von MACs setzen die von MS bereitgestellte APP "RD Client" ein. Dies funktioniert bei allen problemlos.
  2. Meiner Meinung nach, ist es nicht verkehrt den letzten angemeldeten Benutzer nicht anzeigen zu lassen und die Benutzer Ihren Benutzernamen eintippen zu lassen. Hat definitiv den Vorteil, dass nach einer Anmeldung des Admins der Benutzer seinen Benutzernamen kennt und nicht erneut nachfragen muss :rolleyes:
  3. Ich persönlich würde wie du es hier siehst, den Befehl so abfeuern und nur die benötigten Objekte herausfiltern, um die spätere Suche etwas zu beschleunigen und zu vereinfachen. Solltest du mit den Operatoren wie hier "-match" oder "-contains" arbeiten, empfiehlt sich immer mit so wenig Informationen wie möglich zu jonglieren. Manchmal liefern diese nicht die Ergebnisse wie erwartet ;) In diesem folgenden Beispiel werden alle eMail-Adressen als STRING ausgeliefert und mit "-match" der Name "Anke" herausgefiltert. Der Nachteil dieser Methode ist ganz klar, das nicht klar nicht zu wissen, welchem Postfach diese Mail-Adresse zugeordnet ist. (Get-Recipient -ResultSize Unlimited | Select-Object -ExpandProperty EmailAddresses) -match "Anke" Als bessere Variante würde ich dann diese hier bezeichnen, da dort auch der Name des Postfachs vermerkt ist. (Get-Recipient -ResultSize Unlimited | Select-Object -Property Name -ExpandProperty EmailAddresses) -match 'Anke' | Format-Table Name,SmtpAddress Ich hoffe ich konnte Dir hiermit weiterhelfen.
  4. Steht doch auf der Seite was du eingeben musst um die Zellen zu beschreiben oder zu lesen. Als ich das gestern Abend anhand der Informationen der Seite durchgeführt habe, hat es funktioniert und ich wusste auch nicht wie ich das COM-Objekt zu bedienen hatte ;) $excel = New-Object -ComObject Excel.Application $excel.Visible = $true # Neues Workbook (Arbeitsblatt) generieren $workbook = $excel.Workbooks.add() # Bestimmtes Workbook öffnen $workbook = $excel.Workbooks.Open("DATEIPFAD ") # Workbook zum bearbeiten übergeben $sheet = $workbook.worksheets.Item(1) # In die Zelle A1 schreiben $sheet.cells.item(1,1) = "Test" # Aus der Zelle A1 lesen $Info = $sheet.cells.item(1,1)  EDIT: Ich hab nochmal für Dich gegoogelt und bin auf diese Seite gestoßen: PowerShell - Read an Excel file using COM Interface http://www.lazywinadmin.com/2014/03/powershell-read-excel-file-using-com.html 
  5. Also ich hab das mit dem zweiten Suchbegriff in Google gefunden... ;) Hey, Scripting Guy! Automatisierung von Excel https://technet.microsoft.com/de-de/magazine/dd297620.aspx
  6. Computerbild | So richten Sie Ihr PC-Heimnetzwerk ein http://www.computerbild.de/artikel/cb-Ratgeber-Kurse-PC-Hardware-Heimnetzwerk-einrichten-2202659.html Hier findest du bebilderte und beschriebene Anleitungen zu den gängigen MS-Betriebssystemen u.A. auch die Anleitung Ordner freizugeben und im Heimnetzwerk zu arbeiten. Damit sollte es sich einwandfrei einrichten lassen.
  7. In dem Artikel befindet sich ein Pseudocode, der Dir verrät, wie der Algorithmus programiert aussieht: https://de.wikipedia.org/wiki/Secure_Hash_Algorithm
  8. Naja, komm... ein bisschen Googeln wird doch noch drin sein ;) http://stackoverflow.com/questions/8051713/convert-a-string-to-a-byte-array-in-powershell-version-2
  9. Kleiner Tipp: Arbeite an deiner Code-Lesbarkeit! Nicht für alles leere Zeilen einfügen Zusammenhängende Aufgaben gruppieren Ich habe mal versucht herauszulesen was du benötigst... Und dich in allen Bereichen zu verbessern, würde mich und Dich eine Ewigkeit kosten. So habe ich eine kleinere Variante gewählt und ein Skript verfasst. Alle kann ich nicht mit fertigen Skripts versorgen. Nimm dies als Vorlage und vergleiche es mit deinem Skript, um daraus zu lernen was bei deinem Skript falsch oder nicht optimal gelaufen / programmiert ist. <# Autor: Jan Weis Homepage: www.it-explorations.de #> # # Custom Variable # [Int]$intInaktiveDays = 100 # Keine Anmeldung seit ... Tagen ab heute # # Script Variables # $objDateToday = Get-Date $objDateCriticalDate = $objDateToday.AddDays(-$intInaktiveDays) $strCriticalDate = $objDateCriticalDate.ToShortDateString().ToString() # # Script # Write-Host ':: Auslesen & Filtern der AD-Benutzer' -ForegroundColor Yellow $objADUserList = Get-ADUser -Filter '*' -Properties LastLogonTimestamp,Company | Where-Object { ([DateTime]::FromFileTime($_.LastLogonTimestamp)) -le $objDateCriticalDate -and $_.LastLogonTimestamp -notlike '' } Write-Host ':: Ausgabe...' -ForegroundColor Yellow $objADUserList | Format-Table @{Label='Firma';Expression={$_.Company}},Enabled, @{Label='Kritisches Anmeldedatum'; Expression={$strCriticalDate}}, @{Label='Letzte Anmeldung';Expression={[DateTime]::FromFileTime($_.LastLogonTimestamp)}},Name,SamaccountName Write-Host ':: Export zu CSV' -ForegroundColor Yellow $objADUserList | Select-Object Company,Enabled,lastlogonTimestamp,Name,SamAccountName | Export-Csv -Delimiter ';' -Path 'C:\Users\XXX\Desktop\Benutzer.csv'
  10. Ich hab es gerade ausprobiert. Sobald eine erfolgreiche Zuweisung mit Inhalt stattgefunden hat, ist die Ausgabe "True". Falls nicht, ist sie "False"
  11. Vollkommen korrekt. Diese Änderung ist mir Schnelle gar nicht aufgefallen! :schreck: In meinen Varianten kam ein "If" auch nicht drin vor. Neue Variante.... $objJavaProgramList = Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*' -and $_.Version -ne '8.0.1010.13'} ForEach ($objJavaProgramItem in $objJavaProgramList) { Write-host ":: Entferne $($_.Name), Versionsstand: $($_.Version)" $objJavaProgramItem.Uninstall() Start-Process -FilePath '\\fileserver\install\Java8u101\jre-8u101-windows-i586.exe' -ArgumentList '/s' -Verb RunAs }
  12. "Start-Process" ist auch eine Anweisung die direkt ausgeführt wird. Falls das Cmdlet eine Ausgabe (Ergebnis) hat, dann wird diese in die Variable $java_setup abgelegt. Start-Process - TechNet https://technet.microsoft.com/de-de/library/hh849848.aspx Lass die Variable einfach weg und schreibe das "Start-Process" unter deine Uninstall-Routine Um der UAC noch genüge zu tun, musst du noch den Parameter "-Verb RunAs" in "Start-Process" mit einbauen. Sonst wird deine Anwendung als Benutzer und nicht als Administrator ausgeführt. PS: Für zwischen Ausgaben kannst du "Write-Host" benutzen. Bsp: Write-Host "Installiere nun..."
  13. Nachdem ich mich weiter schlau gelesen habe, möchte ich noch einen Punkt in die Runde schmeißen... "Workflow" Wissenswertes https://powershell.org/powershell-workflow-when-should-you-use-it/ https://blogs.technet.microsoft.com/heyscriptingguy/2012/11/22/the-basics-of-windows-powershell-workflow-when-to-use-it-and-why/ Damit kannst du "ForEach"-Schleifen mit dem Argument "parallel" laufen lassen. Das sieht dann in etwa so aus: workflow A { foreach -parallel ($item in $collection) { } } Aufgaben werden Parallel ausgeführt und sparen Dir noch mehr Zeit. Vielleicht bekommst du nun deine Auswertungen nun viel schneller.
  14. Ich habe die unnötigen Leerzeilen mal entfernt und strukturiert. Das ist wichtig, damit man den Code im Nachgang auch wieder lesen kann. Das Debugging wird wesentlich erleichtert. Am Besten gleich angewöhnen. Das Ergebnis sieht das so aus: $java_setup = (\\fileserver\install\Java8u101\jre-8u101-windows-i586.exe /s) if ($objJavaProgramList = Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*' -and $_.Version -ne '8.0.1010.13'}) { ForEach ($objJavaProgramItem in $objJavaProgramList) { $objJavaProgramItem.Uninstall() } { $java_setup } } else { exit } Du hast einen Block der keine Funktion besitzt.... { $java_Setup }... Nachdem ForEach mit "}" beendet wurde, macht der Rest keinen Sinn ;-) Setze es einfach unter "....Uninstall()" In der Powershell solltest du die Programme über "Start-Process" starten, damit die übergebenen Argumente "/s" nicht falsch oder gar nicht interpretiert werden. (Bsp. Start-Process -FilePath -ArgumentList )
  15. Powershell ist eine OO-Programmiersprache mit sehr viel Power, das hast du richtig erkannt. Allerdings ist die Logik dahinter nicht anderst, als bei anderen Sprachen. Kannst du eine, kannst du "quasi" alle. Es wäre allgemein sicher von Nützen, wenn du dich mal mit einer Programmiersprache deiner Wahl auseinandersetzt. Hier hilft auch viel lesen von anderen Skripten und versuchen diese zu verstehen. Am Besten mal in der ISE debuggen und die Variablen nach den einzelnen Vorgängen auslesen.
  16. Danke, das freut mich zu hören. Dann ist das damit ja die Lösung ;-) Du könntest noch das ein oder andere Protokollieren. ( Bsp. msiexec.exe /? ) Wenn die Uninstall()-Funktion von dem WMI-Objekt sauber funktioniert, dann würde ich diese auch so einsetzen. Um auch den Rest der Forum-Benutzer glücklich zu machen, können wir das Ganze noch auf einen "Einzeiler" zusammenkürzen ;-) Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like 'Java*' -and $_.Version -lt '8.0.1010.13' } | ForEach-object { Write-host ":: Entferne $($_.Name), Versionsstand: $($_.Version)"; $_.Uninstall() }
  17. Da der WDS ja von Haus aus dabei ist, lässt das sich sicher gut verknüpfen ;-)
  18. Hallo, ich würde die Versionen anhand des Versionseintrag unterscheiden und das ganze nicht so kompliziert machen. Hier wird erst mal alles gesammelt was vorhanden ist. Danach Filtern wir nach allem mit dem Namen "Java" und einer älteren Version als die angegebene. $objJavaProgramList = Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*' -and $_.Version -lt '8.0.1010.13'} Nun können wir im nächsten Schritt alle gesammelten alten Versionen entfernen. Dies kannst du mit einem ForEach durchführen. ForEach ($objJavaProgramItem in $objJavaProgramList) { $objJavaProgramItem.Uninstall() } Anstatt ".Uninstall()" zu verwenden, kannst du deine msiexec.exe Routine durchführen. Das "x" würde ich auch nicht an das Ende setzten, da das eventuell als Protokollierungsoption gewertet werden könnte. So würde ich das ungefähr umsetzen ;) Start-Process -FilePath "msiexec.exe" -ArgumentList "/x $($objJavaProgramItem.IdentifyingNumber) /qn /norestart" Nun genug der Musterlösung.... :o
  19. Jap, nutzen wir. Es funktioniert super und zuverlässig. Regelmäßig deploye ich 140 Rechner parallel per ZTD (Zero Touch Deployment) Unicast
  20. Wir nutzen den PXE-Boot mit unserem WDS. Folgende Einstellungen nutzen wir für Option 67: boot\x86\wdsnbp.com 66: FQDN
  21. Probiere es mal mit "$_.Name", da "$Dyn" auch mit mehreren DynGruppen gefüllt sein könnte, dann klappt $Dyn.name nicht mehr ;-) Dyn = Get-DynamicDistributionGroup $Dyn | ForEach-Object{ Write-Host "DynamicDistributionGroup: $($_.Name)" Get-Recipient -RecipientPreviewFilter $_.RecipientFilter -OrganizationalUnit $_.RecipientContainer | Select-Object Alias, Name }
  22. Das wäre das Skript was du suchen könntest http://www.it-explorations.de/suchen-umbenennen-von-dateinamen-mit-powershell/
  23. Ist die Offlinesynchronisierung eingeschaltet und eingerichtet?
  24. Ich würde die Daten in den Speicher laden und erst dann verarbeiten. Vielleicht bringt Dir das noch einen Geschwindigkeitsvorteil. Schon mal über diese Variante probiert? $objWinEvent = Get-WinEvent -LogName System | Where-Object {$_.Id -eq 4625 -or $_.Id -eq 4768 -or $_.Id -eq 4771 -or $_.Id -eq 4776 } Edit: Korrektur
  25. Probiere es mal mit "Get-EventLog" # Beispiel Get-EventLog -LogName Application -ComputerName . -After '18.07.16' EDIT: https://technet.microsoft.com/de-de/library/hh849834.aspx
×
×
  • Neu erstellen...