Einleitung

Ziel soll es sein, in einem größeren Netzwerk (30+ PCs) eine Remote Desktop Lösung einzurichten, mit der ein Administrator jederzeit auf den Desktop anderer Benutzer schauen und diese kontrollieren kann. Die Installation und Einstellungen sollen komplett automatisch über Gruppenrichtlinien eines Windows Active Directory laufen. Die Fernwartung soll für Windows XP und Windows 7 funktionieren wobei der eigentliche Fokus natürlich auf Windows 7 liegt.

Voraussetzungen
Ich beschreibe das Szenario in einem Windows Netzwerk mit Active Directory und aktiven Gruppenrichtlinien für fast alle Computer im Netzwerk.
Zugriff auf die Gruppenrichtlinien ist genauso notwendig wie der Zugriff auf ein Netzlaufwerk, das alle Netzwerkuser benutzen können.

Konzept

Die Fernwartung wird komplett mit TightVNC realisiert. TightVNC ist Open Source und kostenlos, derzeit (Dez. 2010) in der Version 2.0.2. Diese Version verwenden wir für Windows 7 und Windows XP in der Installations-Variante. Für Windows XP mit manuellem Start müssen wir die ältere Version 1.3 verwenden (mein Mirror der Version 1.3 unten bei „Downloads“).
Für Windows 7 muss TightVNC 2.0.2 als Dienst auf allen Clients installiert werden. Andernfalls scheitert die ThightVNC Fernwartung bei der UAC. Näheres dazu später. Diese Installation des Dienstes funktioniert ebenfalls für Windows XP und ist 1 von 2 Wegen, das System bei Windows XP zu realisieren.
Alternativ kann für Windows XP ein manueller Start des Servers gewählt werden, das wäre Methode 2. Dazu werden die ausführbaren Dateien auf einem Netzlaufwerk abgelegt, wo alle Mitarbeiter Zugriff haben. Auf Wunsch startet der Mitarbeiter TightVNC und der Administrator klinkt sich ein.
Alle 3 Systemarten sind unten beschrieben.
Die Einstellungen von TightVNC, die für den Betrieb notwendig sein (wie z.B. Verbindungspasswörter, Sicherheitsrichtlinien etc) werden automatisch in die Registry integriert. Bei Windows XP mit Version 1.3 werden die Einstellungen beim ersten Start übernommen, alternativ geht auch hier die Registry-Lösung.

Downloads

TightVNC 2.0.2
Offizielle Downloadseite für die aktuellste Version
Mirror auf hannes-schurig.de
.exe InstallerViewer SourceServer Source
TightVNC 2.0.2 msi Installer

TightVNC 1.3
Offizielle Downloadseite für die ältere Version
Mirror auf hannes-schurig.de
.exe Installer.zip ArchivPortable

Deployment

Windows 7 / Windows XP (Installation)

Windows 7 ist dank der optimierten Benutzerkontensteuerung ein spezieller Fall. Die UAC springt ein, wenn der Benutzerkontext, mit dem etwas ausgeführt werden soll, geändert wird. Das kommt zum Beispiel vor bei „Als Administrator ausführen“ oder „Als anderer Benutzer ausführen“ -> „.\Administrator“. Windows 7 mit aktivierter UAC verdunkelt dann den Bildschirm, fragt nach den Benutzerdaten und aktiviert etliche Sicherheitsfeatures. Diese Sicherheitsfeatures sind der Grund, warum TightVNC 1.3 (die ältere Version) sofort die Verbindung der Fernsteuerung trennt, sobald die UAC aktiv wird.
Ziel soll es deswegen sein, die neueste Version 2.0.2, die zusätzlich für Windows 7 optimiert wurde, als Dienst auf allen Computern zu installieren.
Daraus ergeben sich mehrere Vorteile wie z.B. die Verbindung schon im Windows Login Bildschirm, möglich An- und Abmeldungen oder Benutzer wechseln, ohne dass TightVNC abbricht und keinerlei Benutzeraktionen sind nötig, um eine Verbindung aufzubauen.
Wer also in der Fernsteuerung hin und wieder diese Funktion nutzen möchte („Als Administrator/anderer Benutzer ausführen“, runas /user) und auch die anderen Vorteile braucht, muss den nächsten Schritten folgen.

Auf Windows XP wirkt sich diese Art der Installation ebenfalls aus. Es ist also für beide Systeme geeignet.

Schritt 1 – Download und Installation:
Download von TightVNC 2.0.2 und installieren/entpacken. tvnserver.exe starten, unten rechts im Infobereich erscheint das TightVNC Server Icon, ein schwarzes V auf weißem Hintergrund (noch) mit rotem Rahmen.

Schritt 2 – Passwort und Einstellungen:
Öffnet das Einstellungsfenster von TightVNC und geht die 3 Tabs mit allen Einstellungen durch. Wichtig sind vor allem die Passwörter, weil TightVNC ohne eingestelltes Passwort nicht ohne Weiteres funktioniert. Konfiguriert TightVNC so, wie es auf allen Computern aussehen soll; Passwörter, Port, Web Access, IP Access Control, Konfigurationspasswort etc.

Schritt 3 – Einstellungen exportieren:
Wenn ihr alle Einstellungen gemacht und übernommen habt sollte das ThightVNC Icon nicht mehr rot umrahmt sein. Wenn das so ist, öffnet die Registry und begebt euch zu dem Schlüssel

HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC\Server

. Exportiert den Schlüssel mit Rechtsklick->Exportieren.
Legt die exportierte .reg Datei auf einem Netzlaufwerk ab, wo jeder User Zugriff hat. Vorzugsweise dort, wo ihr Installationskram von Gruppenrichtlinien zu liegen habt. Dort müssen später auch der TightVNC Installer und ein Script rein.
Beispiel: \\server\EDV\GPOs_Install\Remote_Control\settings.reg

Schritt 4 – Registry-Import automatisieren:
Zuerst testen wir den automatischen Import der TightVNC Einstellungen durch ein Script.
Erstellt dazu ein neues Batch Script und kopiert folgende Zeilen hinein:

@echo off
reg import \\server\EDV\GPOs_Install\Remote_Control\settings.reg

Anmerkung: Bei einem Netzwerk, indem sowohl 32bit als auch 64bit Computer im Einsatz sind, muss das Script so aussehen:

@echo off
if %PROCESSOR_ARCHITECTURE% == AMD64 goto 64bit
if %PROCESSOR_ARCHITECTURE% == x86 goto 32bit

:64bit
reg import \\server\EDV\GPOs_Install\Remote_Control\settings64.reg
exit

:32bit
reg import \\server\EDV\GPOs_Install\Remote_Control\settings32.reg
exit

via – Danke an Markus Brunner für die Ergänzung.

Packt das .bat Script ebenfalls auf das Netzlaufwerk.
Zum Test: löscht den Key

HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC\Server

und überprüft mit dem Registrierungseditor, ob der Key wirklich gelöscht wurde. F5 – Aktualisieren nicht vergessen.
Key gelöscht? Dann führt dann das Batchscript aus. Das Script sollte nur kurz aufploppen und das wars. Im Hintergrund wurde die .reg Datei in die Registry eingepflegt.
Wieder F5 und der Server Key müsste wieder da sein.
Dieses Script spielt also die exportierten Einstellungen eurer TightVNC Installation später auf alle PCs. Dadurch bekommen später auch alle PCs das richtige Passwort, dass sich leider nicht automatisiert in die Installation von TightVNC integrieren lässt. Aber Schritt für Schritt…

Schritt 5 – Installation von TightVNC auf alle PCs per Gruppenrichtlinie:
Die Installation von TightVNC 2.0.2 erfolgt mit einer .msi in der Softwareinstallation einer Gruppenrichtlinie, die auf alle Computer angewendet wird, die zu diesem fernsteuerbaren Netzwerk gehören sollen. Die .msi ist oben im Download Part des Beitrags verfügbar. Passt ggf. noch die Properties Parameter mit Orca an, wenn ihr wollt.
Erstellt ein neues Paket im Softwareinstallationsbereich, Erweitert, „auch für 64bit bereitstellen“, „Sprache ignorieren“, Sicherheitseinstellungen (Rechte) richtig? Gut, fertig.

Testet die korrekte Installation von TightVNC auf einigen Test-Clients: in den Diensten müsste „TightVNC Server“ und unter den laufenden Prozessen „tvnserver.exe“ auftauchen, wenn die Installation korrekt lief.
Je nachdem ob ihr die Einstellung „Show icon in the notification area“ deaktiviert habt oder nicht ist auch das TightVNC Icon zu sehen.

Testet mit dem vncviewer die Verbindung: gebt in den Viewer die IP ein, die Passwortabfrage sollte erscheinen. Dann läuft zumindest der Dienst korrekt. Ein Passwort wurde noch nicht gesetzt, also egal was ihr eingebt, „Service is not configured correctly“ (oder Ähnlich) wird nur angezeigt. Ist ja auch korrekt, eure Einstellungen wurden ja noch nicht verbreitet.

Schrit 6 – Einstellungen verteilen:
Das machen wir natürlich nicht von Hand sondern per Startscript.
Also tragt die oben erstellte Batch als Startscript in die Gruppenrichtlinie ein. Das Script enthält den Befehl, die .reg Einstellungen einzupflegen. Alle Dateien (.msi Installer, .reg Export, .bat Script) liegen wie gehabt auf einem Netzlaufwerk, wo für alle User Leserechte bestehen.
Habe das hier mal auf einem Blick:

Schritt 7 – Test
Ein Client PC startet, Tight VNC wird installiert und als Dienst gestartet. Beim diesem ersten Start werden die Einstellungen nocht nicht übernommen!
Also einen neuen PC in die GPO zu nehmen und mit nur 1 Neustart die Remote-Lösung nutzen funktioniert nicht!
Erst nach einem 2. Neustart, bei dem TightVNC bereits installiert ist, werden die Einstellungen übernommen.
Also einen PC 2, 3 Mal neustarten und dann das System testen. Verbinden, Passwort eingeben, dass ihr vor dem Reg Export eingestellt habt, ihr müsstet dann auf dem Rechner sein.

Fragen und Probleme

Ich versuche mal zusammenzufassen, womit ich beim Einrichten dieses System so konfrontiert wurde.

Das Programm wird nicht installiert!
Wenn die .msi in die GPO integriert ist und trotzdem nicht installiert wird, überprüft euer komplettes GPO Kontrukt auf Rechte-/ oder Pfadfehler. Prüft die Ereignisberichte usw. Eine lange Anleitung zum Troubleshooting von GPOs und Softwareinstallationen habe ich hier.

Die Einstellungen werden nicht übernommen!
Wenn das Programm installiert aber auch nach mehreren Neustarts die Einstellungen nicht übernommen werden, stimmt etwas mit der .reg oder der .bat nicht.
Löscht den Server Key wie in Schritt 4 beschrieben, vergewissert euch und fügt den Key durch Doppelklick der .reg wieder hinzu. Hat funktioniert?
Dann löscht den Key erneut und führt die .bat vom Netzlaufwerk aus. So, wie die GPO es machen würde. Hat funktioniert?
Seht ihr einen Fehler wenn ein Client PC die Batch ausführt? Teste es an einem Windows XP Rechner, da sind die Startscripts sichtbar.
Teste mal meinen Workaround für das Ändern von Regkeys von Diensten. Vorher den Dienst mit net stop beenden und danach mit net start wieder starten.
Dann überprüft die Rechte der Startscripte. Lassen sich andere, simple Startscripte aus diesem Ordner (wo .reg und .bat liegen) ausführen? Z.B. ein echo bla pause Script. Ja? Nein? Troubleshooting von GPOs, irgendwo muss ein Fehler sein 😉

In HKEY_CURRENT_USER UND HKEY_USERS sind auch TightVNC Schlüssel, muss ich die nicht auch ändern?
Meiner Erkentnis nach nicht. Änderungen an

HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC\Server

wirken sich nach einem Neustart auch auf die TightVNC Einstellungen der anderen 2 Hives aus. Zudem ist das Editieren der Schlüssel in diesen 2 Hives verdammt kompliziert.

Kann ich nicht TightVNC 2.0.2 (tvnserver.exe) manuell starten wie bei der Windows XP Variante?
Nein, meines Wissens nach geht das nicht. TightVNC 2.0.2 manuell gestartet übernimmt keinerlei Einstellungen, selbst wenn diese bereits korrekt in die Registry eingetragen wurden. Zusätzlich ist TightVNC 2.0.2 beim manuellen Start im „Not listening“ Status. Das heißt, dass keine eingehenden Verbindungen angenommen werden.
Ich habe etwas rumprobiert aber hier keine anständige Lösung für beide Lösungen gefunden. Stattdessen habe ich mich für das Installieren von 2.0.2 für Windows 7 und die ältere Version 1.3 für Windows XP entschieden, bei der das noch funktionierte.

Bei den nächsten 2 Problemen stand mir Kevin Niehage mit seiner kompletten IT Security Expertise zur Seite.

Kann es sein, dass nur die ersten 8 Zeichen des Passworts geprüft werden?
Korrekt, TightVNC nutzt für das Passwort leider eine Verschlüsselungsmethode, die nur 8 Zeichen überprüft. Also wenn euer Passwort „abc123!!“ lautet, dann könnt ihr mit allen Passwörter verbinden, die diese Zeichen am Anfang beinhalten; „abc123!!??“, „abc123!!abc123!!“, egal. Also Vorischt bei der Passwortwahl, komplex sollten die ersten 8 Zeichen schon sein 😉

Das Passwort wird in der Registry abgespeichert, ist das nicht unsicher?
Mit gutem technischen Know How und ausreichend kritischem Forscherdrang lässt sich das Passwort herausfinden. Dazu muss man ziemlich im Quellcode von TightVNC wühlen und sich ein eigenes Decrypterprogramm schreiben. Aber es ist theoretisch möglich. Verwendet also keine kritischen Passwörter, die auch sonst im Unternehmen genutzt werden. Denkt euch ein neues, irrelevantes Passwort aus. Wechselt es regelmäßig, der Aufwand kostet nur max. 2 Minuten.

Meine Frage ist nicht dabei…
Dann schreib mir, Kommentar oder Mail oder Kontaktformular, her damit! Ich gebe mein Bestes zu helfen.

Windows XP Alternative (manueller Start)

Diese Variante für Windows XP ist einfacher einzurichten aber die Handhabung beim täglichen Gebrauch ist nicht wirklich schön. Damit eine Fernsteuerung stattfinden kann, muss der Mitarbeiter den TightVNC Server selber starten. Diese Alternative hat den Vorteil, dass eine Fernsteuerung nur möglich ist, wenn der Mitarbeiter den TightVNC den Server startet. Hier muss also erst eine Kommunikation stattfinden und nicht jeder Computer ist jederzeit kontrollierbar.

Schritt 1 – Download und Installation
TightVNC 1.3 als Installer oder Archiv herunterladen und die 2 Dateien „VNCHooks.exe“ und „WinVNC.exe“ auf einen für alle Benutzer verfügbaren Netzlaufwerkordner kopieren.

Schritt 2 – Konfiguration
Als Test: WinVNC.exe starten, beim ersten Start sollte das Konfigurationsfenster angezeigt werden. In dem Konfigurationsfenster alle nötigen Einstellungen übernehmen.

Schritt 3 – Test
Ein beliebiger Client startet WinVNC.exe. Zuerst mit „Ausführen“ bestätigen, dann erscheint das Konfigurationsfenster (wenn es der erste Start ist). Hier muss der Benutzer selbst das Passwort eingeben, dass der Administrator ihm mitteilt und mit [OK] das Einstellungsfenster schließen.
Nun kann sich der Administrator mit der IP und dem gerade vom Nutzer eingestellten Passwort auf den PC verbinden.

Fragen und Probleme

Kann ich nicht TightVNC 1.3 auch per GPO installieren lassen?
Natürlich. Dazu notwendig wäre nur eine .msi oder eine andere Installationsmethode. Wer noch ausreichend Windows XP Computer im Netzwerk hat sollte diesen Weg beschreiten.

Und was ist mit den Einstellungen? Geht das auch über den Registryimport Trick?
Bestimmt, ich gehe davon aus, dass auch TightVNC 1.3 die Einstellungen in der Registry speichert. Also das selbe Verfahren wie mit Windows 7. Ihr brauch nur den korrekten Schlüssel, wo TightVNC 1.3 schreibt.

Kann ich diese manuelle Methode auch bei Windows 7 verwenden?
Nein, zumindest habe ich nach einigem Aufwand eingeschätzt, dass man bei Windows 7 besser beraten ist, eine Installation des Dienstes durchzuführen. Es wird manuell immer Probleme oder Fehler geben. Siehe Einleitungsabsatz im Windows 7 Part.

Meine Frage ist nicht dabei…
Dann schreib mir, Kommentar oder Mail oder Kontaktformular, her damit! Ich gebe mein Bestes zu helfen.

The End

So, ich habe das Gefühl ich habe irgendwelche wichtigen Schritte vergessen aber das kommt bei etwas komplexeren Dingen schonmal vor.
Ihr habt Fehler entdeckt, gebt mir bitte Bescheid. Verbesserungen, Kritik, Fragen, Wünsche, wie immer per Kommentar oder Kontakt(/Mail).

Weitergabe oder Verwendung dieser Anleitung nur mit voller Quellen- und Autorangabe! Ich bitte euch, seid fair.

Scriptgesteuerte Registrymanipulation über

reg import something.reg

, schön und gut. Aber über folgende Fehler könnte man stolpern.

Die Registry dient häufig als Ablage für Programmeinstellungen, auch für laufende Dienste. Möchte man nun scriptgesteuert die Einstellungen des Dienstes ändern kann es zu folgendem Fehler kommen: „Der Prozess kann auf die Datei nicht zugreifen, da diese von einem anderen Prozess verwendet wird„.
Was dagegen tun? Den Dienst vor dem Reg Import beenden.

@echo off
net stop tvnserver
reg import \\server\pfad\new-config.reg
net start tvnserver

Sollte dabei der Fehler „Fehler beim Zugriff auf die Registrierung.“ auftreten fehlen für den Import vermutlich die Rechte, also als Administrator starten.

Sollte

reg import

den Fehler „Fehler beim öffnen der Datei. Es ist möglicherweise ein Datenträger- bzw. Dateisystemfehler aufgetreten.“ ausspucken, enthält der Pfad zu eurer .reg Datei wahrscheinlich ein Leerzeichen. Setzt die Pfadangabe in Anführungszeichen oder benennt den Leerzeichen-Ordner um.

Ziel ist es, mit einem unbeaufsichtigten Script (also ohne Benutzereingaben etc) alle installierten Netzwerkdrucker (lokal installiert, nicht vom Druckerserver), von denen die IPs bekannt sind, zu löschen. Dieser Vorgang soll unabhängig vom vergebenen Druckernamen auf jedem beliebigen PC funktionieren.

Szenario

Wir haben zum Beispiel 14 verschiedenen Drucker installiert. Nun wollen wir 8 von denen deinstallieren und danach neu installieren. Von den 8 Druckern ist der Name nicht bekannt, da diese bei der Installation beliebig benannt wurden. Da dieser Vorgang auf dutzenden oder hunderten PCs funktionieren soll, ist der Name ein schlechter Anlaufpunkt. Stattdessen wissen wir aber die IP jedes Druckers, der deinstalliert werden soll.
Lokale Drucker wie PDF Drucker oder Microsoft-interne Drucker sollen unberührt bleiben.

Wie löschen wir am besten Drucker scriptbasiert? Mit printui.dll via CMD.
Zum Löschen nutzen wir den Befehl:

rundll32 printui.dll,PrintUIEntry /dl /n "Name des Druckers"

Wie gesagt kennen wir die Druckernamen nicht. Aufgabe ist also, den Namen der gewünschten Drucker zu bekommen und mit diesem dann den Löschbefehl zu starten.

Den Namen bekommen wir (indirekt) von der WSH Funktion EnumPrinterConnections.

Also Schritt 1, Druckernamen herausfinden:

show-printers.vbs

Set WshShell = CreateObject("Wscript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
Set objPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to objPrinters.Count - 1 Step 2
   WScript.Echo "Port: " & objPrinters.Item(i) & " | Name: " & objPrinters.Item(i+1)
Next

.vbs Download (Rechtsklick -> Ziel speichern) | Codegrundlage

Probiert es mal aus, beim Ausführen der .vbs werden alle installierten Drucker nacheinander mit Port und Name angezeigt. objPrinters.Item ist also unser Freund. Die einzelnen Codezeilen erkläre ich nachher im Gesamtbild.

Wir können also die Druckernamen herausfinden und für den printui.dll Löschbefehl weiterverwenden.
Nun wollen wir aber nicht alle installierten Drucker löschen sondern nur die gewünschten Drucker, dessen IPs wir nennen. Zudem sollen Systemdrucker (Microsoft-interne, PDF Drucker etc) erhalten bleiben, genauso wie durch Druckserver hinzugefügte Drucker.

Also schauen wir uns das Konstrukt mal an:

delete-printers.vbs:

Set WshShell = CreateObject("Wscript.Shell")
printer = Array("111.40.162.60", "111.40.162.90", "111.40.162.100", "111.40.162.105", "111.40.162.120", "111.40.162.129", "111.40.162.140")
Set WshNetwork = CreateObject("WScript.Network")
Set objPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to objPrinters.Count - 1 Step 2
  If Left(objPrinters.Item(i+1),2) <> "\\" Then
    For Each item In printer
      If Len(item) >= 2 Then
        If InStr(objPrinters.Item(i), item) > 0 Then
          WshShell.Run "cmd /c rundll32 printui.dll,PrintUIEntry /dl /n " & Chr(34) & objPrinters.Item(i+1) & Chr(34)
        End If
      End If
    Next
  End If
Next

.vbs Download (Rechtsklick -> Ziel speichern)

Nun im Detail:
Zeile 2 enthält, mit Kommata getrennt, die IPs aller Drucker, die gelöscht werden sollen.
Zeile 4 speichert in der Variable objPrinters alle Druckerobjekte.
Zeile 5 startet die Schleife, die so oft durchläuft, wie es Druckerobjekte (objPrinters.Count – 1) gibt. Die Schleife in 2er Schritten (Step 2) durchzugehen muss sein. Denn:
Nachdem EnumPrinterConnections in objPrinters geschrieben hat, sieht objPrinters etwa so aus, um es mal bildlich zu haben und die folgenden Codezeilen einfacher zu verstehen:

Step 2i=AbfrageTypWert
0x0objPrinters.Item(i)Portname[IP_111.40.162.60]
0x1objPrinters.Item(i+1)Druckername .60[Drucker-1]
1x2objPrinters.Item(i)Portname[IP_111.40.162.90_2]
1x3objPrinters.Item(i+1)Druckername .90[Kopierer_EG]
2x4objPrinters.Item(i)Portname[111.40.162.105_1]
2x5objPrinters.Item(i+1)Druckername .105[EG – Netzdrucker]

… usw.
Wir überprüfen den Portnamen, der die IP enthält, aber durch „IP_“ am Anfang oder „_X“ am Ende doch stark variieren kann. Dazu später mehr.
Ab Zeile 6 Nun wird für jeden Port durchgegangen (da jeder 2. Step den Druckernamen überspringt und zum nächsten Port springt):
Zeile 6 prüft mit Left(XXXXXX,2) die ersten 2 Stellen des Druckernamens. Sind diese nicht „\\“ so handelt es sich nicht um einen Druckerserver-Drucker und die Schleife wird fortgeführt.
Zeile 7 startet eine Schleife, die jeden Eintrag des Arrays printer durchgeht. In diesem Array stehen alle Drucker-IPs, die wir löschen wollen.
Zeile 8 prüft, ob der Eintrag des Arrays, der überprüft wird, 2 oder mehr Zeichen lang ist. Ehrlich gesagt, keine Ahnung warum ich damals diese Abfrage eingebaut habe…. 😀 wenn ich drauf kommt packe ich es als edit dazu. Mit Kommentaren wäre das nicht passiert, ich weiß.
Zeile 9 vergleicht den Druckerport (objPrinters.Item(i)) und die eingelesene IP, also: „IP_111.40.162.90_2 <> 111.40.162.90″ und prüft, ob der eingelesene Arraywert im Portnamen vorkommt. Ist der Rückgabewert > 0, so wurde der String 2 (IP aus dem Array) in String 1 (Portname) gefunden. Ist wie Regular Expressions, nur simpler. Wer gut regexen kann, hier könnte es Sinn machen.
Zeile 10 ist nun der Löschbefehl. objPrinters.Item(i+1) steht hier also für einen Druckernamen, der weder Druckserverdrucker noch lokaler Drucker noch ungewollter Drucker ist.
Da wir den Löschbefehl

printui.dll,PrintUIEntry /dl /n "Name"

über

WshShell.Run "Befehl"

laufen lassen müssen, dessen Befehl in Anführungszeichen stehen muss, kriegen wir ein kleines Problem. So würde es nämlich aussehen:

WshShell.Run "cmd /c rundll32 printui.dll,PrintUIEntry /dl /n "Druckername"

Der schlaue Leser weiß längst, dass hier der vbs Befehl nach dem /n als beendet angesehen wird und das Script damit fehlschlägt. Um den Namen des Druckers für printui.dll in Anführungszeichen zu kriegen, nutzen wir das Chr(34), das in ein “ umgewandelt wird. Der vbs Befehl läuft damit weiter und dem CMD Befehl wird ein “ vorgegeben.

Fertsch, Drucker wird gelöscht.

Voraussetzung für das Löschen ist natürlich das Recht dazu, Adminrechte also. CPAU kann helfen, doch wie immer Vorsicht, CPAU ist nicht sicher. Dank Kenny… 😛

Das Programm ist funktionsfähig, getestet und im Produktiveinsatz. Bei Fragen, Wünschen, Verbesserungen oder Kritik etc, Kommentarfeld ist unten oder per Mail/Kontakt.

delete-printer.vbs mit Parametern

Danke an Kenny für die Parameter Idee, macht das Script viel flexibler als zuvor!

Set WshShell = CreateObject("Wscript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
Set objPrinters = WshNetwork.EnumPrinterConnections
If WScript.Arguments.Count = 0 Then
   WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
Else
   Dim first
   first = WScript.Arguments(0)
   Select Case first
      Case "help" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case "/?" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case "-?" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case "?" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case Else 
   End Select
End If
For i = 0 to objPrinters.Count - 1 Step 2
   If Left(objPrinters.Item(i+1),2) <> "\\" Then
      For Each item In WScript.Arguments
         If Len(item) >= 2 Then
            If InStr(objPrinters.Item(i), item) > 0 Then
               WshShell.Run "cmd /c rundll32 printui.dll,PrintUIEntry /dl /n " & Chr(34) & objPrinters.Item(i+1) & Chr(34)
            End If
         End If
      Next
   End If
Next

.vbs Download (Rechtsklick -> Ziel speichern)

Okay, was hat sich geändert? Das Array ist weg und wird durch Parameter ersetzt. Diese werden beim Aufruf einfach hinten angehängt. Mehrere Parameter werden mit Leerzeichen getrennt angegeben. Ein Parameter mit Leerzeichen drin wird einfach in Anführungzeichen angegeben. Das lässt sich also beliebig kombinieren.
Wird kein Parameter angegeben (Doppelklick z.B.) bzw. ist der erste Parameter „help“ o.Ä. so wird eine Usage Hilfe angezeigt.

Beispiel:

delete-printer.vbs 111.40.162.90 111.40.162.105 "Farbe EG" "Farbe 1.OG"

Dieser Aufruf hätte 4 Parameter und würde alle Drucker löschen, die diese 2 Zeichenketten im Portnamen enthalten.

BTW: für VBS Neulinge, hier hab ich etwas Codehilfe her.

Weitergabe oder Verwendung der Anleitung nur mit voller Quellen- und Autorangabe! Ich bitte euch, seid fair.

Auf dem Desktop liegen normalerweise Verknüpfungen von Programmen oder Dateien, die man öfter braucht. Aber ist es nicht nervig, wenn man gefühlte 10 Fenster offen hat und die alle erst minimieren muss, um an die Verknüpfung zu kommen? Ja, das ist es.
Dafür gibt es die Schnellstartleiste im Windows, die aber schnell sehr breit werden und damit die Taskleiste der geöffneten Fenster verdrängen kann.
Und dann gibt es da noch Tools, die diese Aufgabe erfüllen.
Da wären zum Beispiel zusätzliche Task(/Schnellstart-)leisten oder sogar neue Taskleisten, die die Windows Taskleiste verbannen, wie Object Dock. Und diese Art versteckte Suchleiste, die nach Programmen wie Dateien sucht anstatt eine fest angepinnte Auswahl bereitzustellen, wie Launchy.

Ich möchte heute ein Tool vorstellen, dass ich schon sehr lange kenne und für das Thema zusätzliche Schnellstartleiste empfehlen möchte.

Launcher heißt das nicht einmal 1MB kleine Tool. Das Programm ist portable und findet durch seine „Größe“ auf jedem Stick Platz.
Das Programm erschafft eine neue, recht einfach gehaltene Schnellstartleiste, zeichnet sich aber durch die vielen Einstellungs- und Anpassungsmöglichkeiten aus.

Launcher lässt sich also mit sehr vielen Verknüpfungen ausstatten. Maximal 32 Reihen und 32 Spalten, 1024 Shortcuts. Es sind sogar „Seiten“ möglich. 1024 Verknüpfungen pro Seite, 8 Seiten maximal… 8192 mögliche Verknüpfungen… nicht, dass man es bräuchte aber es geht 😀
Hier ist die einzige Einschränkung der unregistrierten Version, es sind maximal 32 Shortcuts erlaubt. Es lassen sich zwar auch alle 8192 Verknüpfungen einrichten und nutzen aber der „Änderung speichern“ Punkt ist dann nicht mehr verfügbar und beim nächsten Start von Launcher ist die zuletzt gespeicherte Einstellung wieder aktiv.
Features: AutoHide, Opacity, AutoOpacity, Icondesign und Iconeffekt beim MouseOver, alles gar kein Problem und beliebig einstellbar.
Um ein Gefühl dafür zu bekommen habe ich das kurz in einem Video demonstriert:

Die Icons lassen sich beliebig wählen. Wird ein Element hinzugefügt so wird das Symbol dieses Elements übernommen. Möchte man ein anderes Icon hinzufügen zieht man einfach ein Element mit dem gewünschten Icon bei gedrückter STRG Taste über das Element im Launcher mit dem „falschen“ Icon.
Mit gedrückter STRG Taste lässt sich die Launcher Leiste verschieben. Sie dockt automatisch an den Bildschirmrändern an. Ist AutoHide eingestellt verschwindet die Leiste zu dem Rand, an den sie gedockt ist.
Nachteil: Launcher funktioniert nur auf dem Hauptmonitor. Sobald 2 Monitore oder mehr angeschlossen sind und man Launcher in den Bildschirmbereich des sekundären Monitors zieht springt es gleich wieder zurück zum primären Bildschirm. Hier wäre besserer Dual Screen Support für die Final der Version 3 wünschenswert.

Launcher gibt es in verschiedenen Sprachen und Skins. Letztere sind aber keine Augenweide. Eine neutrale Hintergrundfarbe fand ich am günstigsten.
Sounds gibt es auch, lassen sich natürlich deaktivieren. Launcher sucht selbstständig nach Updates und fährt auf Wunsch automatisch mit Windows hoch. Achtung; einige Antivirenprogramme könnten meckern, wenn man die Funktion aktiviert, was natürlich falscher Alarm ist, da ein Eintrag in Autostart nunmal notwändig ist.

Launcher bietet sogar einige spezielle Features:
Leider: Strg + F11 macht die Bildschirme zwar schwarz, aber aus irgendwelchen unerklärlichen Gründen habe ich sie nicht mehr zurück bekommen. Einige Sekunden später gingen die Monitore in Stand-By und ich saß da. Hab dann blind über die CMD mit

taskkill /im "launcher.exe

den Normalzustand wiederherstellen können. 😀
Strg + F8 funktioniert irgendwie auch nicht.

Man muss aber dazu sagen, dass ich die Beta von Launcher 3.1 teste, meine Kritik sei also bis zur finalen Version nur vorsichtig zu bewerten.

Ich bin mit Launcher sehr zufrieden, muss ich sagen. Das Tool ist klein, schnell, unauffällig, portable, gut konfigurierbar und macht einfach mal seinen Job, kostenlos.
Die Einschränkung mit maximal 32 Shortcuts in der unregistrierten Version lässt sich verkraften, so viel muss man erstmal wirklich brauchen.
Eine Vollversion gibts für 9,90€ und wer tatsächlich sehr viele Shortcuts clever nutzen möchte kann sich das leisten.

Gewinnspiel
Gute Software gebe ich auch gerne an meine Leser raus, außerdem ist fast schon Wochenende (TGIF), also habe ich für euch 5x die registrierte Version arrangiert!
Jeder kann mitmachen, ein Kommentar genügt. Was haltet ihr von Launcher, kennt ihr das Tool vielleicht sogar? Wieviel Shortcuts würdet ihr dort ablegen?
Ausgelost wird wie immer mit random.org, bis Sonntag den 28.11.2010. Bekanntgabe dann so schnell wie möglich. Von den Gewinnern brauch ich wie üblich die Anschrift, nur 1 Teilnahme pro Person erlaubt, ich überprüf das wie immer.

Ja, dann wünsch ich euch viel Glück und ein schönes Wochenende!

Die Windows CMD bietet eine brauchbare Druckerverwaltung in der Kommandozeile an.
Dank der printui.dll, die ihr mit der rundll32.exe ansprecht und die alle nötigen Werkzeuge enthält, könnt ihr Drucker hinzufügen, verwaltungen, löschen und mehr.
Dadurch lassen sich bestimmte Jobs wunderbar in Scripte packen.
Code Grundgerüst:
rundll32.exe printui.dll,PrintUIEntry /Parameter
Groß- und Kleinschreibung bei PrintUIEntry beachten, case sensitive.

Nun schauen wir auf die Möglichkeiten von printui.dll.

/a[Datei] Name der Binärdatei
/b[Name] Basisdruckername
/c[Name] UNC-Computername, wenn der Vorgang auf einem Remotecomputer ausgeführt wird.
/dlLöscht den lokalen Drucker.
/dnLöscht die Netzwerkdruckerverbindung.
/ddLöscht
den Druckertreiber.
/eZeigt Druckeinstellungen an.
/f[Datei] Entweder
INF-Datei oder Ausgabedatei.
/gaFügt Druckerverbindungen pro Maschine hinzu.
/geListet Druckerverbindungen pro Maschine auf.
/gdLöscht Druckerverbindungen pro
Maschine.
/h[Arch] Treiberarchitektur Alpha | Intel | Mips | PowerPC.
/iaInstalliert Druckertreiber mithilfe einer INF-Datei.
/idInstalliert
Druckertreiber mithilfe des Assistenten.
/ifInstalliert Drucker mithilfe der
angegebenen INF-Datei.
/iiInstalliert Drucker mithilfe des Assistenten und
einer INF-Datei.
/ilInstalliert Drucker mithilfe des Assistenten.
/inFügt eine Netzwerkdruckerverbindung hinzu.
/j[Anbieter] Druckanbietername
/kDruckt eine
Testseite auf dem angegebenen Drucker aus. Kann bei der Druckerinstallation
nicht verwendet werden.
/l[Pfad] Quellpfad des Druckertreibers
/m[Modell]
Modellname des Druckertreibers
/n[Name] Druckername
/oZeigt die Druckerwarteschlange an.
/pZeigt Druckereigenschaften an.
/qStiller Modus.
Fehlermeldungen werden nicht angezeigt.
/r[Anschluss] Anschlussname (Hier auch
die Möglichkeit Lokale Schnittstellen, anstelle des UNC Pfades anzugeben)
/sZeigt Servereigenschaften an.
/SsSpeichert Druckereinstellungen in einer Datei.
/SrStellt Druckereinstellungen aus einer Datei wieder her. Speichert
Optionsattribute für Druckereinstellungen oder stellt diese wieder her. Die
Attribute müssen am Ende des Befehls  stehen:
2 PRINTER_INFO_2
7 PRINTER_INFO_7
c
Farbprofil
d Druckerdaten
s Sicherheitsbeschreibung
g Globaler DevMode
m
Minimale Einstellungen
u Benutzer-DevMode
r Namenskonflikte lösen
f Namen
erzwingen
p Anschluss zuordnen
/uVerwendet den vorhandenen Druckertreiber,
sofern bereits einer installiert ist
/t[#] Nullbasierte Indexseite zum Starten
/v [Version] Eine der folgenden Treiberversionen:
Windows 95 oder 98 | Windows NT 3.1 | Windows NT 3.5 oder 3.51 | Windows
NT 3.51 | Windows NT 4.0 | Windows NT 4.0 oder 2000 | Windows 2000
/wFordert einen Treiber an, wenn der angegebene
Treiber nicht in der INF-Datei gefunden wird.
/yRichtet den Drucker als
Standarddrucker ein.
/XgLiest Druckereinstellungen.
/XsRichtet
Druckereinstellungen ein.
/zGibt diesen Drucker nicht automatisch frei.
/ZGibt diesen Drucker frei. Verwendung nur mit der Option
/if möglich.
/?Zeigt diese Hilfemeldung an.
@[Datei] Datei mit Befehlszeilenargumenten

Die Tabelle ist von Mark Heitbrink von gruppenrichtlinien.de.

Die volle Hilfe, printui.dll /? ist etwas länger, hat viele Beispiele und wen es interessiert: hier als Download.

Beispielszenario:
Man muss allen Mitarbeitern eines Betriebes bestimmte Drucker eines Druckerservers bereitstellen. Das geht zwar auch über Gruppenrichtlinien aber oftmals hat dieser Weg entscheidende Nachteile, wo sich Scripte besser eignen.

Auf dem Server ist ein Druckserver eingerichtet, der Drucker mit allen Treibern (für das Serversystem und alle Clientsysteme (XP+7 32bit+64bit)) installiert und freigegeben.

Druckerinstallation per Netzwerk:
rundll32.exe printui.dll,PrintUIEntry /in /n „\\server\Canon iR400 EG“
/in steht für „install network printer“, /n gibt den Freigabenamen des Druckers (natürlich mit Verbindung des Servernamens) an.

Sollen mehrere Drucker eingerichtet werden empfielt es sich, das Konstrukt etwas auszubauen. Zum Beispiel kann man in dem Script abhängig von der Etage des Mitarbeiters auch gleich den richtigen Standarddrucker setzen lassen (Parameter /y).

Hier mein Scriptbeispiel:

@echo off
cls

echo Wo befindet sich Ihr Büro?
echo --------------------------
echo 1 - Erdgeschoss
echo 2 - 1. Obergeschoss
echo 3 - Dachetage
set /p etage=Eingabe (1/2/3): 
if %etage%==1 set drucker=KopiererEG
if %etage%==2 set drucker=Kopierer1.OG
if %etage%==3 set drucker=Kopierer2.OG

echo.
echo %drucker% wird als Standarddrucker eingerichtet.
echo.

:drucker1
echo Installiere Kopierer EG
if "%etage%"=="1" goto drucker1std
rundll32 printui.dll,PrintUIEntry /in /n "\\iqbserver\Kopierer EG" >> nul
echo Installation abgeschlossen
echo.
goto drucker2

:drucker1std
echo Definiere als Standarddrucker
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer EG" /y >> nul
echo Installation erfolgreich
echo.
goto drucker2

:drucker2
echo Installiere Kopierer 1.OG
if "%etage%"=="2" goto drucker2std
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer 1.OG" >> nul
echo Installation erfolgreich
echo.
goto drucker3

:drucker2std
echo Definiere als Standarddrucker
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer 1.OG" /y >> nul
echo Installation erfolgreich
echo.
goto drucker3

REM :drucker3
REM ... und so weiter

Das lässt sich mit beliebig vielen Druckern durchführen, die alle nacheinander auf dem Computer des Mitarbeiters eingerichtet werden. Verbunden mit errorlevel kann man noch cleverer als ich hier reagieren, z.B. den Befehl mit erhöhten Rechten erneut probieren o.Ä. (CPAU Warnung, Nutzung auf eigene Gefahr)

Weitergabe oder Verwendung des Textes nur mit voller Quellen- und Autorangabe! Ich bitte euch, seid fair.

Folgendes Phänomen:
Die Fehlermeldung „Element wurde nicht gefunden“ wird bei jeder Ordneraktion (Erstellen, Löschen, Verschieben, Umbenennen) angezeigt. Der Ordner existiert natürlich. Nach einem Klick auf „Wiederholen“ wird die Aktion fehlerfrei durchgeführt.

Dieses Problem bekam ich vor kurzer Zeit an meinem privaten PC. 1, 2 Wochen später das Selbe auf Arbeit.
Zeit eine Lösung zu finden. Und die fand ich im Antary Blog von Tobias (btw: Lesetipp). Er hatte das Problem ebenfalls und hat eine Lösung im Netz gefunden, einen Registry Fix:

Schritt 1:
Registry Fix (KB980408_fix.reg) herunterladen und per Doppelklick anwenden

Download section
KB980408_fix [.reg]

Registry Key anwenden, PC neustarten und das Problem ist behoben.

Sollte das doch noch nicht reichen gäbe es hier noch eine Lösung, die aber nicht mehr so richtig zu funktionieren scheint:
Wer Windows Updates automatisch bezieht kann meistens Schritt 1 überspringen, da das Update auf aktuellen Windows 7 PCs schon installiert ist. Wer auf Nummer Sicher gehen möchte,
Schritt 2:
Update KB 980408 installieren (x86, x64)

Über den Ursprung kann man nur Rätseln. Tobias vermutet, dass der nur Fehler auftritt, wenn man Bibliotheken Explorer Tweaks angewendet hat. Z.B. die Bibliotheken aus dem Dateibrowser entfernen, nicht anzeigen lassen o.Ä.
Da ich diese Tweaks sowohl zu Hause als auch auf Arbeit durchgeführt habe, könnte da was dran sein.

Ich sehe recht häufig Windows Nutzer mit einer Taskbar, die das Look’n’Feel von Mac nachmacht.
So zum Beispiel die Freeware ObjectDock von Stardock. Das Tool ersetzt nach der Installation die Windows Taskleiste durch eine neue Ablageleiste, „Dock“ genannt. Ihr könnt dort wie gewohnt Verknüpfungen oder Dateien ablegen, Widgets integrieren und sonst alles machen, wofür eine Taskleiste so zu gebrauchen ist.

Ganz links wie gewohnt der Start-Button, daneben die Verknüpfungen und ganz rechts alle geöffneten Fenster. Die Uhr tickt live mit, weitere Docklets (so heißen die Widgets hier) wie Kalender, Websuche oder Wetter lassen sich ebenfalls einbauen.
Per Rechtsklick kann man auf die wichtigsten Funktionen und Einstellungen zugreifen, zum Beispiel das Feature „Magnification„. Die Vergrößerung der Icons im Mausfokus ist typisch Mac Feeling.

Alles zusammen schon eine optisch ansprechende Taskbar.

Doch mal ehrlich, warum braucht man sowas? Ich sitze doch nicht am Rechner und beobachte meine Taskleiste sondern ich nutze Programme und bin dann auf diese fixiert. Ich spiele Spiele oder schaue Serien/Filme, da sehe ich die Taskleiste nicht einmal. Wenn ich die Taskleiste brauche dann muss ich mit dieser alle geöffneten Fenster gut überblicken und managen können. Ich muss schnell Zugriff auf die wichtigsten Programme und Informationen haben. Mein System sollte da so gut wie gar nicht beeinträchtigt werden.
Daher ist eine solche Leiste für mich kontraproduktiv.
Die meisten Programmicons sind gar nicht für eine größere Darstellung (vor allem bei Magnification sichtbar) geeignet, der Charme schwindet schnell.
Ab 10-15 geöffneten Fenstern (das passiert zumindest auf Arbeit täglich) werden einige Icons durch das Vergrößern des Magification Effekts zu beiden Seiten „rausgeschoben“, der Überblick geht aber auch ohne diesen Effekt schon flöten.
Den Mehrverbrauch an RAM/CPU möcht ich lieber nicht wissen.