Ich habe letztens auf Stackoverflow einen kleinen Trick gefunden, wie sich beliebige Textinformationen, beispielsweise Zugangsdaten oder Passwörter, mit Batch versteckt in Dateien speichern und von dort wieder auslesen lassen.
Das dient sicher nicht für kritische Daten – vor einfachen neugierigen Blicken in Batch-Dateien kann man aber immerhin etwas verbergen.
Weiterlesen
Kategorie: IT
Excel: schnelle Navigation zwischen Tabellenblättern mit VBA
Worum geht’s?
Wir befinden uns ins Excel, versionsunabhängig: Denkbar ist dabei eine große Menge an „Detail-Sheets“ und ein „Übersichts-Sheet“, zwischen denen immer schnell hin und her navigiert werden soll. Ein kurzes Beispiel soll eine einfache Navigation zwischen Tabellenblättern (Sheets) in Excel zeigen.
Weiterlesen
Adobe Reader DC Windows AD Batch-Script-Deployment
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
- Lokale AIP-Installation (z.B. C:\adc1516\) der Basisversion mit:
msiexec /a AcroRdrDC1500720033_de_DE.msi
- Aktuellsten Patch in die lokale AIP-Installation Slipstreamen (lokalen .msi Pfad beachten):
msiexec /a "C:\adc1516\AcroRdrDC1500720033_de_DE.msi" /p AcroRdrDCUpd1501720053.msp
- 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).
- Mit dem Adobe Reader DC Customization Wizard die C:\adc1516\AcroRead.msi öffnen und beliebig anpassen. Änderungen wie vorgegeben als AcroRead.mst speichern.
- (Es müssten jetzt 3 Dateien und 4 Ordner in C:\adc1516\ existieren.) Den lokalen AIP-Ordner auf euer Deployment-Laufwerk verschieben.
- Deployen mit der .msi und .mst:
start /w msiexec /i "%wd%\deploy\%version%\AcroRead.msi" /qn TRANSFORMS="%wd%\deploy\%version%\AcroRead.mst"
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:
Außerdem wird die VersionCompare.exe benötigt.
Hier nun das Script:
Den 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.
Windows UAC per Registry/Batch konfigurieren
Das Windows-Feature „User Account Control“ (UAC), im deutschen Windows auch Benutzerkontensteuerung genannt, ist seit Windows Vista verbaut und sorgt für sichereres Rechtehandling beim Ausführen von Programmen. Im Hintergrund steckt außerdem ein Sandboxing-Prinzip, wodurch unterschiedliche Programme in unterschiedlichen Nutzer- und Rechtekontexten auf einem Desktop vereint zusammen arbeiten können.
Die Benutzerkontensteuerung kann auf eine von vier unterschiedliche Stufen gestellt werden; eine davon entspricht der Deaktivierung, die anderen drei realisieren unterschiedliche Sicherheitsstufen.
Im (vertrauensvollen) Unternehmenseinsatz ist eine auf Stufe 1 gestellte UAC sinnvoll, damit administrative Aufgaben auch direkt aus der Anmeldung eines eingeschränkten Nutzers per Eingabe von Admin-Daten möglich ist. Diese lässt sich beispielsweise mit Batch und Registry konfigurieren und im Windows AD verteilen, hier der Code:
@echo off & Color 9f & setlocal set wd=\\server\Deployment\Sonstiges\activate-uac set log=%wd%\activate-uac-log.txt set uacconfig=99 REM Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren ::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto check ::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 reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 1 /f set uacconfig=%errorlevel% reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 5 /f set uacconfig=%uacconfig%%errorlevel% reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorUser /t REG_DWORD /d 3 /f set uacconfig=%uacconfig%%errorlevel% reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v PromptOnSecureDesktop /t REG_DWORD /d 0 /f set uacconfig=%uacconfig%%errorlevel% echo %date% %time:~0,8% - %computername% hat UAC Settings übernommen: %uacconfig% >> %log% :end endlocal
Die unterschiedlichen Werte der einzelnen Registry-Eigenschaften könnt ihr hier übersichtlich nachlesen. Es gibt noch weitere Punkte der UAC, die über die Registry gesteuert werden können.
PS: Das Konzept hinter der UAC ist äußerst komplex und es macht u.U. Spaß, sich als fortgeschrittener Windows-Nutzer darin einzulesen.
Windows Fehlercode: 0xc004f014 bei Aktivierung/Upgrade
Nur eine kurze Hilfe für den Fehlercode: 0xc004f014, der beispielsweise beim Upgrade von Windows 10 Home auf Professional auftreten kann. Vor allem dann, wenn ein neues Gerät mit installiertem Windows 10 Home ausgeliefert wird und dann ein Upgrade auf Pro erfolgen soll.
Lösung:
- Windows-Symbol -> Einstellungen -> Update und Sicherheit -> Aktivierung -> Product Key ändern
- den offiziellen Universal-Key für Windows 10 Pro eingeben:
VK7JG-NPHTM-C97JM-9MPGT-3V66T - Tasse Kaffe machen und warten bis die Installation durchgeführt und der PC wieder hochgefahren ist
- Startmenü -> Einstellungen -> Update und Sicherheit -> Aktivierung -> Product Key ändern und nun den erworbenen Pro-Key eingeben
Klingt seltsam, funktioniert aber. Warum auch immer Microsoft solche Standardsituationen nicht ordentlich behandeln kann…
Weitere Windows Update Fehler und ihre Lösung findet ihr hier.
Aktive PC-Sessions mit PsLoggedOn im Windows Netzwerk anzeigen
Einfache Windows-Admin-Frage: Welcher Mitarbeiter ist in diesem Moment und seit wann an welchem PC eingeloggt?
Einfache Antwort, kurz und knackig: Batch!
Mit Hilfe von PsLoggedOn, welches sich im selben Verzeichnis befinden muss wie das Skript:
@echo on & Color 9f & setlocal for /f "Tokens=1" %%c in ('net view /domain:"%USERDOMAIN%"^|Findstr /L /C:"\\"') do ( for /f "Tokens=*" %%u in ('PsLoggedOn -L %%c^|find /i "%USERDOMAIN%\"') do ( echo %%c %%u ) ) endlocal pause goto :EOF
via (leicht angepasst)
Windows Dienste mit wmic service besser verwalten
Der Befehl
sc
aus der Windows Konsole, mit dem sich die Windows Dienste steuern lassen, hat einen entscheidenden Nachteil: Es sind keine Wildcards möglich, der Dienstname muss exakt so angegeben sein, wie er im System registriert ist.
Somit sind
sc stop
und
sc delete
schnell am Ende ihrer Möglichkeiten.
Angenommen ich habe einen oder mehrere Dienste mit einem bestimmten Namenspattern, die angesprochen und verarbeitet werden müssen. Das Namenspattern könnte beispielsweise sein: „[beliebige Zeichenkette]Manager“. Weitere Platzhalter wie „[beliebig]win[beliebig]svc[beliebig]“ sind ebenfalls möglich.
Im Gegensatz zu sc bietet
wmic service
entsprechende Möglichkeiten, mit Wildcards und komplexeren Anfragen umzugehen:
Abfragen:
REM Laufende Dienste mit "Manager" im Namen in der Konsole abfragen und einzelne Informationen filtern wmic service where (name like "%%Manager%%" and state="running") get caption, name, state, status REM Export aller Prozesse mit "Manager" im Namen als HTML exportieren wmic service where (name like "%%Manager%%") get /format:hform >> C:/services.html REM Namenspattern [beliebig]win[beliebig]svc[beliebig] suchen wmic service where (name like "%%win%%svc%%") get caption, name, state
Starten/Stoppen/Löschen:
wmic service where (name like "%%win%%svc%%") call startservice wmic service where (name like "%%Manager%%" and state="running") call stopservice wmic service where (name like "%%Manager%%") call delete