Zusätzliche Befehle im Explorer-Kontextmenü von Vista

Gerade habe ich durch Zufall im Explorer von Windows Vista entdeckt, dass sich das Kontextmenü verändert, wenn man die Umschalttaste festhält. Es ist hierbei egal ob man dies mit der rechten Maustaste oder mit der Kontextmenütaste macht. Es erscheinen 3 zusätzliche Befehle, wenn man eine Datei selektiert hat:

  1. An Startmenü anheften
  2. Zur Schnellstartleiste hinzufügen
  3. Als Pfad kopieren

und 2 neue Befehle wenn man ein Verzeichnis ausgewählt hat:

  1. Eingabeaufforderung hier öffnen
  2. Als Pfad kopieren 

Die beiden ersten Befehle für Dateien kann man vergessen.

Ganz anders sieht das jedoch mit dem letzten Befehl Als Pfad kopieren aus.  Der ist überaus nützlich um den Pfad einer Datei, oder gar die Pfade mehrerer Dateien in die Zwischenablage zu kopieren.
Unter XP hatte ich dazu immer noch das uralte Windows 95 Powertoy SendToX verwendet, das es leider für spätere Windows Versionen nicht mehr gab. Eigentlich schade, aber nun verschmerzbar.

Auch der Befehl Eingabeaufforderung hier öffnen ist sehr nützlich. Denn mit diesem Befehl kann man direkt ein DOS-Fenster in einem bestimmten Verzeichnis öffnen. Dafür gibt es zwar auch Registry-Hacks, aber Vista liefert das inklusive.
Leider verwendet Vista hier immer CMD.EXE und nicht den Befehlszeileninterpreter, der in COMSPEC eingetragen ist. Ich verwende seit Jahren 4NT.EXE und deshalb ist bei mir auch 4NT.EXE in COMSPEC eingetragen. Aber das ist verschmerzbar, denn 4NT mach seine eigenen Einträge im Explorer Kontextmenü, wenn man dies wünscht.

PS: Entdeckt habe ich das ganze, weil ich wusste, dass man bei einem Word Dokument zusätzlich den Befehl Schreibgeschützt Öffnen angeboten bekommt, wenn man die Umschalttaste festhält und das Kontextmenü öffnet über die rechte Maustaste oder die Kontextmenütaste. Das funktioniert auch für Excel-Dateien. Vielleicht wusste das ja auch noch nicht jeder ❗

Installation alter TSPs unter Vista

Viele Telefonanbieter haben keine Updates für Vista, oder für ältere Telefone gibt es keine neuen Treiber, weil die Modelle oft schon nicht mehr produziert werden. Weiterhin scheitert oft schon die Installation der alten TSPs, weil die Installationsprogramme Vista nicht berücksichtigen. In vielen Fällen lassen sich die TSPs, die unter Windows 2000 und Windows XP funktionieren auch unter Vista nutzen.

Im Allgemeinen ist es nur notwendig die entsprechende Datei mit der Endung .TSP im Windows\System32 Verzeichnis einer bestehenden Installation zu finden. Die meisten TSPs bestehen aus einer einzigen DLL, die meistens keine anderen DLLs mehr benötigt. Zur Not greift man zu DEPENDS.EXE und prüft die Abhängigkeiten.

Diese Datei wird auf den Vista Rechner wieder in das Verzeichnis Windows\System32 kopiert. Der Name der TSP Datei ähnelt in den meisten Fällen auch dem Produktnamen. Der Name des TSP für ein Elmeg C100 ist z.B. eltelsp32.tsp, der des C300 lautet c3x0tsp.tsp.

In der Systemsteuerung öffnet man die Telefon- und Modemeinstellungen. Dort wählt man den Karteireiter Erweitert. Über den Schalter Hinzufügen kann man nun den alten Treiber in die Liste der aktiven TSPs aufnehmen.
Evtl. ist es nur noch notwendig den TSP über den Schalter Konfigurieren korrekt einzurichten.

„Elevated“ Programme unter Vista / Windows 7 / Windows 8 / Windows 10 haben auf einmal keine gemappten Laufwerke mehr

Ist man Administrator unter Vista, Windows 7, Windows 8 oder Windows 10 und UAC ist aktiviert, dann existieren technisch zwei Sicherheits -Tokens. Ein Token mit den vollen Administrativen Rechten und ein reduziertes gefiltertes Token, ohne Admin-Rechte.

Wenn man sich anmeldet und Netzwerklaufwerke (Freigaben/Shares) zugeordnet werden, dann erfolgen diese Laufwerksmappings in dem Token mit den reduzierten Rechten.

Startet man nun eine Session mit angehobenen, vollen administrativen Rechten, dann sind die vorher zugeordneten Netzwerklaufwerke in dieser Session nicht sichtbar.
Ein etwas ungewöhnliches aber durchaus logisches Verhalten.
Das Logon Skript läuft eben nicht in dem selben Sicherheitskontext, wie Prozesse, die man mit vollen angehobenen Rechten startet. Defakto sind es wirklich zwei verschiedene Logon’s mit zwei verschiedenen Logon-ID’s.

Mit einem einfachen setzen eines Registry Keys kann man jedoch erreichen, dass auch die angehobenen Admin-Sessions die gleichen Laufwerkmappings erhalten:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
EnableLinkedConnections = 1 (DWord)

Aber leider ist dieser Schalter nicht als Standard gesetzt.
Ärgerlich wird dies, wenn man ein kleines Setup-Programm schreiben will, dass einige Daten aus dem Nezwerk kopieren soll und dem man ein entsprechendes requireAdministrator-Manifest gibt. Startet man dieses Programm findet es auf einmal nicht mehr die Laufwerke, die eben noch verfügbar waren. Umgehen kann man das ganze nur in dem man UNC-Dateinamen verwendet.

Beschrieben wird dies auch hier auch in diesem KB Artikel und besonders dieser TechNet Artikel.

Installation von VC6 unter Vista

Es ist ein Anachronismus und ich weiß gar nicht warum ich das hier schreibe. 😉 Aber es gibt doch immer wieder Leute die Visual C++ 6.0 bzw. Visual Studio 6.0 auf Vista installieren wollen.

❗ Grundsätzlich rate ich jedem ab, für Neueintwicklungen VC6 weiterhin zu verwenden.
Dieser Compiler und diese IDE sind überaltert und VC2005 ist ein würdiger und wirklich guter Nachfolger. Was die Änderungen bzgl. Wizards etc. betrifft ist es reine Gewöhnungssache.

Nun aber gib es genug Legacy Code der evtl. einen Bugfix braucht. OK Also wie installiert man dann VC6 auf Vista? Bzw. Geht es überhaupt?
Ja! Es geht.

Wichtig ist, nur, dass man UAC für die Dauer der Installation am Besten komplett abstellt. Es genügt IMHO nicht nur das Setup als Admin zu starten. Das erkennt Vista sowie entsprechend und fordert dazu auf. Also bei mir spielte sich die Installation der Visual Studio 6.0 Enterprise Version in etwa so ab:

  • UAC abschalten (am einfachsten über die System-Steuerung) und den Rechner neu starten.
  • Nun unbedingt einen Account verwenden der lokaler Admin ist (Aber das war jedem klar, oder?)
  • VC6 Installation starten. Die nette  Meldung über bekannte Kompatibilitätsprobleme nehmen wir dankbar zur Kenntnis.
  • Jetzt wird evtl. die VM für Java aktualisiert und neu gestartet (was sonst).
  • Zwischendrin erfolgt noch mal eine Warnung über bekannte Kompatibilitätsprobleme die wir wieder gerne quittieren.
  • Nun dürfen wir wie gewohnt installieren. Man kann sich die Data Access Components übrigends sparen. Meistens sind sowieso schon neuere Versionen auf dem Rechner. Gleiches würde ich mit den SDK Tools machen. Diese alten Tools machen manchmal auch Ärger beim registrieren.
  • Irgendwann kommt manchmal noch eine Frage nach den JIT-Debugger  settings, am Besten auch die nicht verändern.
    Und wie gewohnt erfolgt ein Neustart der Maschine am Ende der Installation.
  • Danach VC6 SP6 installieren und Rechner neu starten (was sonst).
    Für SP5 muss man etwas hexen, aber es geht mit Tricks auch.
  • Danach UAC wieder einschalten, und es erfolgt der nächste Neustart 😉


Anmerkungen

  • Der Standard Pfad zum Anlegen der Projekt sollte natürlich nicht verwendet werden. Der liegt dämlicherweise ja unter C:\Program Files, aber ich gehe auch hier davon aus, dass dies logisch ist…
  • Beim ersten Start des Compilers und einiger Tools kommen wieder Meldungen über Kompatibilitätsprobleme (vcspawn.exe, rc.exe), diese schalten wir für immer aus.
  • Man sollte VC6 übrigends auch nicht nach VC2005 installieren. Andernfalls muss man VC2005 einer Reparaturinstallation unterziehen. Einige der Registrierungen für den Explorer werden sonst überschrieben und arbeiten nicht mehr korrekt. Aber das ist ja bei allen Installationen von mehreren VS Versionen schon so gewesen. Immer nacheinander installieren beginnend mit der ältesten Version!

Danach arbeitet VC6 ohne Murren. Wenn man möchte kann man für VC6 (devenv.exe) sogar manuell ein Vista Manifest geben, indem man die entsprechende devenv.exe.manifest Datei erzeugt. Nach Geschmack setzt man requireAdministrator oder asInvoker. Für bestimmte Fälle beim Debuggen bietet sich hier requireAdministrator an.

Die Manifest Pest…

Hier noch mal ein paar wirklich nette Sachen, die zeigen warum ich Manifeste mittlerweile  nicht mehr ganz so mag (um es wirklich vorsichtig auszudrücken):

Was passiert eigentlich wenn man ein internes UND ein externes Manifest zu einer DLL oder EXE hinzufügt?

  1. Auf einem XP Rechner wird der Lader das externe Manifest bevorzugen, das interne Manifest wird ignoriert.
  2. Auf einem Windows 2003 oder Vista Rechner wird das interne Manifest bevorzugt und das externe Manifest wird ignoriert.
  3. Handelt es sich um eine DLL die mit LoadLibrary geladen wird, dann wird niemals ein externes Manifest berücksichtigt, selbst wenn kein internes Manifest vorliegt. Hier verhalten sich XP, 2003 und Vista gleich.

Ein Grund mehr zu meiner Empfehlung: Verwende immer nur interne Manifeste!

Mein erster Codeproject Artikel…

Nun habe ich es endlich mal geschafft und meinen ersten kleinen Artikel auf Codeproject geschrieben:

http://www.codeproject.com/cpp/PrivateAssemblyProjects.asp

 Er schließt sich nahtlos an über alles das was ich hier achon über die Manifest-Hölle geschrieben haben…

Automatsiches Update des Thunderbird unter Vista

Ich benutze bereits seit Jahren den Thunderbird als Newsreader, weil ich die Macken des Outlook Express einfach satt war. Zudem ist das Quoteverhalten des Thunderbird einfach und vorbildlich.

Jetzt wunderte ich mich in den letzten Tage, dass ich immer wieder gesagt bekommen habe, dass das neue Update 1.5.0.12 verfügabr ist, auf meinem XP SP2 Rechner war das Update im ersten Anlauf installiert. Aber immer, wenn ich das automatische Update gestartet habe auf meinem Vista Laptop, meinte er nur es würde installiert, wenn ich den Thunderbird neu starten würde. Aber Pustekuchen.

Nach dem dritten Fehlversuch habe ich mir gedacht:
Na Vista wird dem Thunderbird ja nicht einfach Zugriff geben und gefragt nach einem elevated Programmstart wurde ich auch nicht. Und die ACL für die Thunderbird Verzeichnisse sind auch nicht verändert.

  • Also einfach den Thunderbird mal als Admin gestartet.
  • Update ausgewählt.
  • Aufforderung zum Neustart abgewartet.
  • Thunderbird neu gestartet.
  • Bingo!

Hier sollten die Programmierer des Thunderbirds einfach mal den ShellExecute(Ex) mit einem RunAs Verb verwenden. Dann würde das Update auch wirklich automatisch durchgeführt, nach dem Elevate-Prompt.

Siehe dazu auch meinen Eintrag hier: http://blog.m-ri.de/index.php/2007/05/09/wie-einen-prozess-unter-vista-mit-gehobenen-rechten-starten/

Was UAC besser verdaulich gemacht hätte!

In den Einstellungen für einen Programm-Link fehlt die Einstellung Mit normalen Benutzerrechten starten. Von mir aus könnte diese Option auch in den Kompatibilitätseinstellungen drin sein.

Wie es die Option „Als Administrator ausführen“ gibt, fehlt eben das Gegenteil:
Führe das Programm als normaler Benutzer aus.

Was soll diese Option bewirken? Diese Option soll das Programm so starten, wie es unter Windows 2000 oder XP unter normalen Benutzerrechten (ohne Adminrechte) auch laufen würde.

D.h. es würde auch das Admin-Token nicht zugewisen bekommen und bei einem Zugriff schreibend auf HKLM oder C:\Program Files, würde das Programm einfach „Kein Zugriff“ gemeldet bekommen. UAC würde für diesen Fall einfach außen vor bleiben.

Alle Programme, die ich geschrieben habe, kommen damit klar. Eigentlich ärgerlich ist ja nur, dass diese Programme unter Vista nun auf einemal schreiben könne, auch wenn es eben dann nur im Virtualstore landet.

Tausende von Kompatibiltätsproblemen durch das stille Virtualisieren könnte man so umgehen.

_MFC_NOFORCE_MANIFEST und _ATL_NOFORCE_MANIFEST

In meinem Blog habe ich bereits über Libraries und die Verwendug von _CRT_NOFORCE_MANIFEST geschrieben (siehe Link unten).

Wenn man nun eine Library erzeugt, die die MFC oder die ATL benutzt, sollte man sich auch noch der beiden Defines _MFC_NOFORCE_MANIFEST und _ATL_NOFORCE_MANIFEST bewusst sein. Diese beiden Defines verhindern, dass durch die Verwendung der ATL bzw. MFC Include-Dateien #pragma comment(linker,”/manifestdependency:..”) Statements erzeugt werden.

Werden diese Defines konsequent verwendet, dann hat der Benutzer der Library die volle Kontrolle welche CRT, MFC bzw. ATL Version angebunden wird.

Warum man sich mit diesen Defines beim erzeugen einer Library auseinenadersetzen sollte kann man in diesem Artikel nachlesen: Warum man seine Libraries mit _CRT_NOFORCE_MANIFEST erzeugen sollte!

❗ BTW: Durch diese Defines kann man allerdings nicht verhindern, dass überhaupt Manifest-Einträge erzeugt werden. Selbst wenn man sein Programm mit den entsprechenden Defines kompiliert. Die Objektdateien haben dann zwar keine Manifest-Einträge, aber spätestens in dem Moment, in dem man das Programm linkt werden aus der CRT, MFC bzw. ATL Libraries Objektdateien gezogen die wieder entsprechende #pragma comment(linker,”/manifestdependency:..”) Einträge haben. Entsprechend bekommt das Manifest Tool dann auch Futter. Dazu mehr in einem späteren Artikel 🙂

Wie einen Prozess unter Vista mit gehobenen Rechten starten?

Was macht man eigentlich wenn man einen Prozess unter Vista hat, der mit normalen Rechten arbeitet, nun aber einen Prozess starten möchte, der angehobene Rechte (elevated) benutzen soll? Also quasi eine Abkürzung für „rechter Mausklick -> Als Administrator ausführen“.

Das ist ausgesprochen einfach! Man verwendet ShellExecute oder ShellExecuteEx mit dem neuen Verb „runas“.

Der nachfolgende Code startet die Systemsteuerung mit angehobenen (administrativen/elevated) Rechten. Vorher erfolgt natürlich die allseits bekannte UAC Nachricht. Ist der User kein Administrator bekommt er eine Meldung, dass er sich entsprechend anmelden soll. Ansonsten muss er dem Zugriff zustimmen. Bricht der User den Dialog ab wird nichts ausgeführt.

int _tmain(int argc, _TCHAR* argv[])
{
  SHELLEXECUTEINFO shExecInfo;
  
  shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  shExecInfo.fMask = NULL;
  shExecInfo.hwnd = NULL;
  shExecInfo.lpVerb = _T(„runas“);
  shExecInfo.lpFile = _T(„control.exe“);
  shExecInfo.lpParameters = NULL;
  shExecInfo.lpDirectory = NULL;
  shExecInfo.nShow = SW_SHOW;
  shExecInfo.hInstApp = NULL;
  
  ShellExecuteEx(&shExecInfo);
  return 0;
}

❗ PS: Übrigens versteht auch Windows 2003 Server und Windows XP das „runas“ Verb. In diesem Fall wird der entsprechende Anmeldedialog gezeigt, der es erlaubt den aktuellen Benutzer zu verwenden (mit evtl. eingeschränkten Rechten), oder eben einen anderen Account. Nett! 🙂
Nur scheinbar auch ein Feature, dass wieder mal nicht dokumentiert ist.