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

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

Kurze Sidenote und Ergänzung meiner Deployment-Sammlung: Ein Hipchat Batch Uninstaller für das Netzwerk.
Wir sind mittlerweile auf Slack umgestiegen und von daher musste Hipchat weg, das war jedoch nicht weiter schwer. Die bereits vorhandene Standardroutine für die Deinstallation im Installer wurde um wmic Befehle erweitert und auf diese eine Aufgabe verschlankt. Probleme gab es keine weiter, läuft gut durch.

@echo off && color 9f && setlocal
set wd=\\lea\Deployment\Software\Hipchat
set log=%wd%\hipchat.log
set exepath=none
set retry=0

REM:: Clientfilter: nur die Computer aus der allowedPCs.txt dürfen deinstallieren
::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 deinstallieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end

:check
if exist "C:\Program Files (x86)\Atlassian\HipChat4\HipChat.exe" set exepath="C:\Program Files (x86)\Atlassian\HipChat4\HipChat.exe"
if %exepath%==none echo %date% %time:~0,8% - %computername% findet das .exe Verzeichnis nicht >> %log% && goto end
goto uninstall

:uninstall
if %retry%==1 goto retryfailed
TASKKILL /f /im hipchat.exe
echo %date% %time:~0,8% - %computername% deinstalliert Hipchat... >> %log%
start /w "" "C:\Program Files (x86)\Atlassian\HipChat4\unins000.exe" /s /silent /qn
del /q /s "C:\Program Files (x86)\Atlassian"
wmic product where "name like 'Hipchat %%'" call uninstall /nointeractive
wmic product where "name like 'Hipchat%%'" call uninstall /nointeractive
echo %date% %time:~0,8% - %computername% hat Hipchat deinstalliert, überprüfe... >> %log%
set retry=1
set exepath=none
goto check

:retryfailed
echo _!_ %date% %time:~0,8% - %computername% Deinstallation fehlgeschlagen! >> %log%
goto end

:end
endlocal
exit

hipchat-batch-uninstaller-log
Die Logausgaben sind in der aktuellen Version des Codes etwas sinnvoller, bitte nicht wundern.

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.
Das Bild zeigt den Dialog der UAC beim Starten eines Programms mit Adminrechten
Die Benutzerkontensteuerung kann auf eine von vier unterschiedliche Stufen gestellt werden; eine davon entspricht der Deaktivierung, die anderen drei realisieren unterschiedliche Sicherheitsstufen.

Das Bild zeigt die Einstellungen der Benutzerkonstensteuerung (UAC)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.

via, via

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)

Das Bild zeigt das gekürzte PsLoggedOn-Script, welches zu allen eingeschalteten Domänencomputern die eingeloggten Nutzer anzeigt.