Skript als Admin via Kontextmenü

Powershell Skripte haben in der Handhabung einen kleinen Nachteil gegenüber Batch-Skripten: Sie lassen sich nicht einfach über das (Rechtsklick-)Kontextmenü als Administrator starten.
powershell-skripte-run-as-admin-standard-before

Kontextmenüeintrag für ein bestimmtes Skript

Erstellt von der Skriptdatei eine Verknüpfung via Rechtsklick -> Senden an -> Desktop und öffnet die Eigenschaften dieser Verknüpfung. Unter Ziel wird der Pfad zur .ps1 Datei angegeben. Verändert das Ziel folgendermaßen:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -NoExit "[Pfad]"

Optional kann über „Anderes Symbol…“ -> C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -> das Powershell-Icon mit UAC-Icon eingestellt werden. Somit ist die Verknüpfung visuell als eine Admin-fähige Verküpfung gekennzeichnet:
powershell-skripte-run-as-admin-shortcut-after-context-menu

Kontextmenüeintrag für jedes Skript

Noch besser: Der Kontextmenü-Eintrag „Als Administrator ausführen“ bei jeder Powershell-Datei, ohne Verknüpfung. Hierzu müssen in der Registry Änderungen gemacht werden, die sich am einfachsten über Batch Skripte ausführen lassen:

Kontextmenüeintrag hinzufügen:

:: Add value for UAC shield icon:
REG ADD "HKCR\Microsoft.PowerShellScript.1\Shell\runas" /v HasLUAShield /t REG_SZ /d "" /f
:: Add value to create context menu item:
REG ADD "HKCR\Microsoft.PowerShellScript.1\Shell\runas\command" /ve /t REG_EXPAND_SZ /d "\"%%SYSTEMROOT%%\System32\WindowsPowerShell\v1.0\powershell.exe\" -executionpolicy bypass -nologo -file \"%%1\"" /f

(Hinweise: Der Code MUSS mit Adminrechten in der CMD ausgeführt werden – entweder von Hand oder in einem .bat Skript zwischenlagern.)
powershell-skripte-run-as-admin-regedit-batch-commands
powershell-skripte-run-as-admin-regedit-after-context-menu

Kontextmenüeintrag wieder entfernen:

REG DELETE "HKCR\Microsoft.PowerShellScript.1\Shell\runas" /f

via

Windows Updates suchen ewig

Wenn Windows 7 für eine Weile keine neuen Windows Updates bekommen hat und diese später nachholen soll, kann es sein, dass sich das System zu Tode lädt. Es wird ewig gesucht und nichts gefunden. Vielleicht waren die Windows Updates längere Zeit deaktiviert oder es handelt sich um ein älteres Image.
Windows 7 verwendet eine Technologie zum Erkennen von installierten und noch benötigten Updates, welche über die Jahre mehr und mehr überfordert ist mit der Menge an Informationen. Hier braucht Windows 7 Unterstützung durch 2 Patches und im Notfall weiteren Fixes, damit die Updates wieder schnell gefunden und installiert werden.

Update: Neuer Fix von Winfuture

Winfuture hat für genau dieses Fehlverhalten mittlerweile einen eigenen Fix veröffentlicht, welcher ein Set aus 5 Updates installiert, unter anderem auch die unten erwähnten. Vor der Installation dieses Pakets muss der Windows Update Dienst beendet (net stop wuauserv) oder Windows Updates deaktiviert werden.
Link zum Winfuture Windows 7 Update Fix

Fix

Hauptsächlich helfen die Updates 3020369 und 3172605 in diesem Fall. Sollten die Updates nicht einfach per Doppelklick installiert werden können, probiert vorher den Windows Update Dienst zu beenden, hier die CMD Befehle:

net stop wuauserv
:: KB3020369 installieren
:: Neustart
net stop wuauserv
:: KB3172605 installieren
:: Neustart

Damit sollten die Updates wieder laufen. Ich verwende diese Methode bereits seit Langem auf Arbeit um alte Windows 7 Systeme wieder schnell an das Windows Update anzubinden.

Problem nicht gelöst?

Falls es Probleme gibt, ist eventuell Windows Update an sich beschädigt. Möglicherweise hilft das Update KB3102810, die Neuinstallation des Windows Update Agents (unter „Manuelles Herunterladen des Windows Update-Agents“, Version 7.6 für Windows 7) oder das pcw-Fix Windows Update.
Weitere Windows Update Fehler habe ich hier im Blog – die Suchfunktion hilft.

via

Sicher entfernen

Jeder weiß es aber nur die Wenigsten tun es: Hardware (vor allem USB-Speichermedien) sicher entfernen vorm Abziehen. Es sind noch teilweise Relikte aus alten Zeiten (wie das Defragmentieren), dass USB-Speichermedien sicher entfernt werden müssen. Das lag unter anderem am aktivierten Schreibcache, durch den Schreibvorgänge erst durch den RAM in den USB-Stick gingen. Durch das Abziehen oder Stromverlust entstanden hier korrupte Daten. Seit Windows 8 (oder Win10, unsicher) ist dieser Schreibcache standardmäßig deaktiviert. Trotzem kann der USB-Stick durch plötzlichen Stromverlust beschädigt werden.

Nun ist es aber manchmal gar nicht so einfach – das Gerät will sich einfach nicht entfernen lassen! Egal wie oft man das „Hardware sicher entfernen“ Menü benutzt und selbst wenn alle Programme geschlossen sind. Klar, Herunterfahren würde reichen, aber es geht auch noch anders.
externe-datentraeger-sicher-entfernen-windows-feature-failure

Entfernen erzwingen

Über die Windows Kommandozeile, genauer gesagt mit dem Tool Diskpart, lassen sich Medien sehr zuverlässig entfernen. Zuerst wird das Volume ausgewählt und dann mit remove all dismount ausgeworfen.
Hier eine beispielhafte Befehlsabfolge:

diskpart
list volumes
select volume 6
remove all dismount

externe-datentraeger-sicher-entfernen-windows-diskpart-success

Kleine Tools wie RemoveDrive können diesen Prozess noch flexibler und mächtiger gestalten und dienen der Automation.
via

Info

Relativ einfache Anforderung: Es sollen Registry Keys nach bestimmten Inhalten durchsucht und diese dann herausgefiltert werden. Gesucht wird sowohl in den Attributbezeichnern als auch in den Werten, Achtung an dieser Stelle, dass nicht zu viel gelöscht wird.
Kurzes Beispiel:
registry-filtern-mit-batch-beispiel
Das Skript könnte mit dem Filter „Memento“ die ersten fünf Einträge herauslöschen. Mit „Version“ oder „Client“ würde jeweils ein Eintrag gelöscht werden. Somit ist das Skript wie ein Regex-ähnlicher Filter zum Löschen von Registry-Einträgen zu sehen.
Außerdem habe ich das Skript in zwei verschiedenen Varianten programmiert: Variante 1 ist einfach und arbeitet 1 Filteranfrage ab. Variante 2 verbaut den Code in einer Funktion und kann beliebig oft mit unterschiedlichen Filterparametern aufgerufen werden. Beide Skript sind durch möglichst viele Variablen gut anpassbar für den schnellen Einsatz.
weiterlesen

cleanmgr-windows-datentraegerbereinigung-automatisieren-guiDie Windows Datenträgerbereinigung wird von vielen Nutzern über die GUI benutzt. Diese wird normalerweise über die Eigenschaften einer Partition -> Bereinigen oder das Startmenü -> Datenträgerbereinigung gestartet. Allerdings kann die Bereinigung auch mit der Kommandozeile gesteuert und somit automatisiert werden. Möglich wäre also eine regelmäßige automatische Datenträgerbereinigung, ohne, dass der Nutzer dafür aktiv werden muss.

Das Programm hinter der Datenträgerbereinigung heißt cleanmgr.exe und lässt sich über einige wenige Parameter steuern, die sich wie gewohnt via cleanmgr.exe /? angezeigen lassen. Besonders attraktiv ist die Möglichkeit, Einstellungs-Sets (also Profile) erstellen und ausführen zu können. Dafür wird mit cleanmgr /sageset:[Nummer] ein Profil erstellt – über die gewohnte GUI. Später wird das Profil mit cleanmgr /sagerun:[Nummer] ausgeführt. Die Nummer kann beliebig zwischen 1 und 65535 sein und steht praktisch als ID für das Profil.
cleanmgr-windows-datentraegerbereinigung-automatisieren-set-run

Mit dem Windows Aufgabenplaner wird dieser Befehl nun als Aufgabe erstellt und regelmäßig ausgeführt. Somit reinigt sich Windows regelmäßig selbst – kleine Katzenwäsche ohne Aufwand.
cleanmgr-windows-datentraegerbereinigung-automatisieren-aufgabe

Vorspiel

Ich habe in letzter Zeit auf Arbeit mit einigen Rechnern gekämpft, die die AD-Gruppenrichtlinien nicht mehr ausführen wollten, genau genommen gar keine AD-Verbindung mehr hatten. Die Anzahl der Geräte, die sich bei meinem Deployment-Manager gemeldet haben, sank immer weiter.
Mit den PCs schien ansonsten alles in Ordnung: Domänenmitgliedschaft, Internet, Intranet, Serververbindung mit Netzlaufwerken, alles da.
Wie kommt’s?

weiterlesen

Intro

Das Deployment von Adobe Reader DC im Windows Netzwerk via GPO Batch-Startscript ähnelt der Verteilung des alten Adobe Readers sehr – dennoch fasse ich die wichtigsten Steps hier zusammen.

Vorbereitung

Ihr braucht für die Verteilung immer die DC-Basisversion (als .msi) und das aktuellste, gewünschte Update (als .msp).
Außerdem, um die Reader Installation vor dem Deployment anzupassen, den installierten Reader DC Customization Wizard.

Step-by-Step

  1. Lokale AIP-Installation (z.B. C:\adc1516\) der Basisversion mit:
    msiexec /a AcroRdrDC1500720033_de_DE.msi

    Das Bild zeigt den Reader DC Installationsdialog, der durch die AIP gestartet wurde

  2. Aktuellsten Patch in die lokale AIP-Installation Slipstreamen (lokalen .msi Pfad beachten):
    msiexec /a "C:\adc1516\AcroRdrDC1500720033_de_DE.msi" /p AcroRdrDCUpd1501720053.msp

    Das Bild zeigt den CMD Befehl um das aktuelle Reader DC Update in die lokale AIP Installation zu slipstreamen

  3. Im lokalen AIP Ordner C:\adc1516 eine leere setup.ini Datei erzeugen und die AcroRdrDC1500720033_de_DE.msi in AcroRead.msi umbenennen (Letzteres ist nur eine kosmetische Anpassung).
  4. Mit dem Adobe Reader DC Customization Wizard die C:\adc1516\AcroRead.msi öffnen und beliebig anpassen. Änderungen wie vorgegeben als AcroRead.mst speichern.
    Das Bild zeigt den Adobe Reader DC Customization Wizard
  5. (Es müssten jetzt 3 Dateien und 4 Ordner in C:\adc1516\ existieren.) Den lokalen AIP-Ordner auf euer Deployment-Laufwerk verschieben.
    Das Bild zeigt die fertige Reader DC Deployment Installation im Deployment Share
  6. Deployen mit der .msi und .mst:
    start /w msiexec /i "%wd%\deploy\%version%\AcroRead.msi" /qn TRANSFORMS="%wd%\deploy\%version%\AcroRead.mst"

infos, infos, infos, via

Skript und Deploy

Das Deployment habe ich seit Reader 11 etwas verändert. Statt „complete-Ordner“ setze ich nun auf eine Versionsüberprüfung der Programm-exe. Das ist dynamischer und lässt sich differenzierter behandeln. Im Falle von Reader DC ist die Versionierung jedoch etwas seltsam. Beispielsweise lautet das aktuellste Update „AcroRdrDCUpd1501720053.msp“, nach der Installation wird die Dateiversion der .exe jedoch mit 15.17.20050 angegeben. Möglicherweise haben hier die Entwickler geschlampt.

Jedenfalls ist für die Verteilung mit Versionsüberprüfung noch ein Zwischenschritt notwendig:
Schaut im gerade erstellten lokalen AIP-Ordner, bzw. den schon aufs Deployment-Laufwerk kopierten Ordner die Eigenschaften Datei AcroRd32.exe an (liegt unter .\program files\Adobe\Acrobat Reader DC\Reader\) – im Tab Details steht die Versionsnummer, die ihr ins Skript und somit auch als Ordnernamen im Deployment-Laufwerk angeben müsst:
Das Bild zeigt die Dateieigenschaften von AcroRd32.exe und die Verweise auf das Skript und das Deploymentlaufwerk
Außerdem wird die VersionCompare.exe benötigt.

Hier nun das Script:
Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

@echo off & Color 9f & setlocal
set wd=\\server\Deployment\Software\Reader
set log=%wd%\reader-log.txt
set readerEL=999
set retry=0
set forcecleanup=yes
set deactivateToolsSidebar=yes
REM:: ******************
set version=15.17.53
REM:: ******************

REM:: Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren
::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto start
::goto end

REM:: Clientfilter: die Computer aus der deniedPCs.txt dürfen nicht installieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end

:start
if not exist %wd%\deploy\%version%\complete md %wd%\deploy\%version%\complete
if not exist %wd%\deploy\%version%\complete\%computername% goto beforeinstall

if "%deactivateToolsSidebar%"=="yes" goto restoreToolbar

:beforeinstall
if "%forcecleanup%"=="yes" goto cleanup
goto install

:cleanup
echo %date% %time:~0,8% - %computername% deinstalliert alle Reader Versionen... >> %log%
REM:: uninstall all reader versions
taskkill /im acrord32.exe /t /f
taskkill /im acrord64.exe /t /f
start /w %wd%\cleaner\reader-cleaner-9.exe /silent /product=1
start /w %wd%\cleaner\reader-cleaner-10.exe /silent /product=1
start /w %wd%\cleaner\reader-cleaner-dc.exe /silent /product=1
echo %date% %time:~0,8% - %computername% hat alle Reader Versionen deinstalliert... >> %log%
goto install

:install
echo %date% %time:~0,8% - %computername% startet die Installation... >> %log%
start /w msiexec /i "%wd%\deploy\%version%\AcroRead.msi" /qn TRANSFORMS="%wd%\deploy\%version%\AcroRead.mst"
set readerEL=%errorlevel%

if %readerEL%==1618 goto retry REM:: msiexec process in use, installation already in progress
if %readerEL%==1602 goto retry REM:: user canceled installation
if %readerEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
echo %date% %time:~0,8% - %computername% hat die Installation abgeschlossen, Errorlevel: %readerEL%... >> %log%
if %readerEL%==0 md %wd%\deploy\%version%\complete\%computername%
if "%deactivateToolsSidebar%"=="yes" goto restoreToolbar
goto end

:restoreToolbar
if exist "c:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroApp\" set instpath=c:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroApp
move "%instpath%\ENU\disabled\AppCenter_R.aapp" "%instpath%\ENU"
move "%instpath%\ENU\disabled\Home.aapp" "%instpath%\ENU"
move "%instpath%\ENU\disabled\Viewer.aapp" "%instpath%\ENU"
move "%instpath%\DEU\disabled\AppCenter_R.aapp" "%instpath%\DEU"
move "%instpath%\DEU\disabled\Home.aapp" "%instpath%\DEU"
move "%instpath%\DEU\disabled\Viewer.aapp" "%instpath%\DEU"
rd "%instpath%\ENU\disabled"
rd "%instpath%\DEU\disabled"
echo %date% %time:~0,8% - %computername% hat die Installation optimiert >> %log%
goto end

:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hat die Installation abgeschlossen, Errorlevel: %readerEL%, retry in 5min... >> %log%
set retry=1
ping localhost -n 300 > nul
goto cleanup

:retryfailed
echo %date% %time:~0,8% - %computername% hat die Installation abgeschlossen, Errorlevel: %readerEL%, retry failed, end >> %log%
goto end

:end
endlocal
exit

Alternatives Deployment

Auf der Seite 404techsupport.com habe ich einen noch einfacheren Deployment-Guide gesehen. Dort wird nur anhand des aktuellsten Installers gearbeitet – leider hatte ich noch nicht die Zeit dieses Deployment zu testen. Das hole ich sicher noch nach und Update dann hier.
Einzige Einschränkung: Das Deployment funktioniert nur über .exe, ist also nicht für das normale GPO Softwaredeployment via .msi geeignet.
Hier die Zusammenfassung, die der Autor mir per Mail zukommen ließ:

I download the latest executable from Adobe’s FTP site for Adobe Reader DC and deploy that with a script.
ftp://ftp.adobe.com/pub/adobe/reader/win/AcrobatDC/1501620039/

I created a transform using the Adobe Customization Wizard and the .msi version of the installer.
My script then installs the executable and uses the transform as a parameter.

\\server.fqdn\share\AdobeReader\LatestReaderDC.exe /sPB /rs /msi TRANSFORMS=\\server.fqdn\share\AdobeReader\ReaderDC.mst

(The script runs at startup assigned by Group Policy. It checks a network location for a „receipt“ for that computer to see if it has run before, and if not, executes the above command. I empty the „receipts“ folder after I download the new installer to the share so that the script executes on their next startup.)

If that works for your deployment options, it’s pretty straight-forward and avoids the annoying .msp patching (security patch or quarterly patch?). If you need an .msi to deploy, you are probably stuck with your steps of creating the admin install.