Die Erkennung von registry-Virtualisierung
Habe ich eine Reihe von C# (v2) - apps, und ich bin kämpfen, mit der registry-Virtualisierung in Win7 (und in geringerem Maße auch Vista).
Ich habe einen shared-registry-Konfiguration-Bereich "meine Anwendungen" zugreifen zu können, müssen in HKLM\Software\Company... Vor Vista war alles nur geschrieben und gelesen von diesem Ort aus, wie gebraucht.
Den code entsprechend erkannten Fehler zu schreiben, dass registry-Schlüssel und würde wieder fallen, angemessen (das schreiben in HKCU statt und informiert den Benutzer, dass die Einstellungen, die Sie angewandt hatte, würde nur auf den aktuellen Benutzer).
In Vista, registry-Virtualisierung brach dies alles, weil die access-check wurden wir mit der HKLM schreiben würde "erfolgreich" still und Virtualisierung zur HKCR\VirtualStore\Machine... statt. In diesem Fall würde der Benutzer denken, dass Sie gerettet hatte, Maschinenweite Konfiguration, aber hatte stattdessen nur geschrieben, um den virtuellen Speicher.
Leider auch nur zu versuchen, zum auflisten der Berechtigungen auf der reg-Schlüssel HKLM explizit gibt Ergebnisse zurück, die angibt, dass der Benutzer Zugriff hat, ob Sie es tun oder nicht.
Wenn wir Hinzugefügt Vista-Unterstützung, die Problemumgehung, die wir verwendet wurde, war zum durchführen einer probe in HKLM schreiben,... und dann schauen Sie in HKCR\VirtualStore\Machine... für den gleichen Wert, und beachten Sie, dass die Virtualisierung stattgefunden hatte, wenn der Wert gefunden wurde.
Win7 scheint gebrochen zu haben, diese (wieder) da Abfragen gegen den ausdrücklichen virtuellen Standort (HKCR) zeigen nun zusammengeführten Ergebnisse aus der HKLM Lage, auch wenn das schreiben war nicht virtualisiert.
Hat jemand irgendwelche Vorschläge für die Arbeit dieses?
Einschränkungen:
- Ich brauche eine Lösung, die funktioniert, ohne dass die Höhe (wenn ich das nicht über administrator-Berechtigungen werde ich den fallback auf einer pro-Benutzer-Konfiguration, die in HKCU, aber ich muss in der Lage sein, zu erkennen, in diesem Fall zuverlässig).
-
Es braucht, um zu arbeiten mit einem v2 C# app (Eine option, die ich gesehen habe für C++ - code einbetten, ein manifest, die deaktiviert Virtualisierung für die .exe aber ich habe nicht in der Lage zu tun, dass in C# V2 siehe deaktivieren Sie die Ordner-Virtualisierung in windows).
-
Es braucht, um zu arbeiten, ohne ein "installer" (dies schließt die Fähigkeit zu deaktivieren Virtualisierung auf die registry-Schlüssel, die wir brauchen, ala die REG FLAGS... - Befehl).
- Haben Sie versucht, zu verwenden boxedapp? Es kann helfen. Viel Glück!
- Sie verwenden sollten, boxedapppacker oder boxedapp. Itemulate system-registry für eine Anwendung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine exzellente Frage gestellt, +1 (Warum ist es community-wiki, die Sie verdient Punkte!)
In der Regel gibt es eine Reihe von Regeln (die [wie hast du Sie laufen in] wird im Laufe der Zeit variieren) die Kontrolle, ob UAC [und damit implizit Registry] Virtualisierung im Spiel sind.
Einige markante Teile der Registry Virtualization-Regelsätze-Dokumentation in der MSDN sind:
Wenn Sie nicht in einer position Einfluss auf irgendwelche der oben, das ist das ideal, und Sie wollen damit zu erkennen, ob der UAC-Virtualisierung gilt im aktuellen Kontext verwenden diese Antwort zu ein, was vielleicht auf den ersten nicht appeat zu einer ähnlichen Frage. (Natürlich würden Sie noch brauchen, um zu entscheiden, ob es für die jeweilige Taste, die Sie gerade operiert, das ist ein bewegliches Ziel, die Sie offensichtlich nicht wollen, um code implementieren muss, um änderungen zu verfolgen, wenn es überhaupt vermieden werden - aber in den meisten Fällen sollte es relativ klar sein.)
Können Sie aktivieren /deaktivieren Virtualisierung auf einer pro-Schlüssel-basis, nach diese, aber es sagt, dass Sie verwenden, ein Kommandozeilen-tool. Aber es muss einen Weg, es zu tun programmgesteuert.
Könnte es am einfachsten sein, einfach ausschalten der Virtualisierung in Ihre app komplett durch Einstellung requestedExecutionLevel-in Ihrem manifest. Sie können versuchen, highestAvailable, aber das kann bedeuten, dass Ihre app läuft immer als Administrator. Es scheint zu bedeuten, nur wenn er auf asInvoker wird, schalten Sie die Virtualisierung. Sehen auch.
Beachten Sie, dass
HKCR
ist eine virtualisierte store selbst, eine Kombination vonHKLM\Software\Classes
undHKCU\Software\Classes
.Der beste Ansatz wäre, nicht mal die registry-Virtualisierung stattfinden. Erstens überprüfen Sie den Benutzer erhöht ist zur Laufzeit und dann können Sie den Benutzer informieren, dass die änderungen nur für den aktuellen Benutzer, noch bevor Sie beginnen, änderungen vorzunehmen.
Durch erkennen, wenn Sie administrator mit erhöhten rechten in der ersten Ort, den Sie einfach vermeiden Sie das schreiben in HKLM, wenn es virtualisiert werden.
Beispiel:
Hinweis: ich nicht von code in C#, Beispiel, angehoben wird, Frage Wie kann ich erkennen, ob mein Prozess wird ausgeführt, UAC-elevated oder nicht?
Ich hatte ein ähnliches problem und die Einführung einer MANIFESTEN gelöst.
Ich war unter Berufung auf die Registrierungs-Sicherheit zu verhindern, dass die (Win32) Applikation von der Erstellung Schlüssel in der HKLM/Software/Wow6432Node wenn die Ausführung als Standardbenutzer, und war ziemlich überrascht zu sehen, dass es war succeceding unabhängig, aber kein Schlüssel vorhanden war und es wurde erstellt anstatt unter diesem neuen VirtualStore Bereich.
Die registry virtualization ist deaktiviert, wenn die PE-manifest enthalten, werden diese Informationen in Bezug auf die Sicherheit. Nicht erforderlich die Erhöhung von Berechtigungen meinem manifest enthält die folgenden Knoten:
Für die ausführbare Datei, um die Kompatibilität mit Vista und XP scheinbar jeder Knoten in der TrustInfo Abschnitt enthält die namespace:
Einmal das manifest war richtig eingebettet in meine .exe (es hat mich ein paar versuche, durch änderung der entsprechenden Eigenschaften des Projektes) war das Programm am letzten scheitern wie ich erwartet hatte.
Für verwalteten code, das manifest aufgenommen werden können als post-build-Schritt durch ausführen der mt.exe tool. Zum Beispiel, wie berichtet, in der MSDN-Artikel
Ich lieber mit dem manifest-Ansatz eher als das ändern der flags der registry-Knoten mit reg.exe wie bereits in dieser Artikel, da dies macht das Verhalten konsistent auf allen Maschinen.
Hoffe, das hilft (auch wenn nach dem Lesen das Datum des ursprünglichen posting, ich bin mir ziemlich sicher, das problem wurde vor langer Zeit gelöst!!)
Alberto