2009-09-18 15 views
5

In meiner Anwendung muss ich Einstellungen speichern, die "global" (d. H. Nicht benutzerspezifisch) an einem bekannten und vorhersagbaren Ort gespeichert sind.Speichern von 'globalen' Daten als Standardbenutzer?

Ich möchte die Anwendung von überall (als Standardbenutzer, kein Administrator) ausgeführt werden können, einschließlich mehrerer Kopien von verschiedenen Standorten und in der Lage sein, die gespeicherten Konfigurationsdateien zu lesen und zu schreiben.

Die Daten müssen Lese- und Schreibzugriff für ALLE Standardbenutzer haben, nicht nur einen.

, die mit im Auge, die vier Optionen hier zu beachten sind ungeeignet: http://msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA

Also, was sind meine Alternativen?

Meine Anwendung ist in C++ und nur für Windows geschrieben. Ich muss Windows XP und höher unterstützen.

Danke.

EDIT:

Um zu klären, Rennbedingungen, verursacht durch mehrere Instanzen ignorieren. Diese Frage bezieht sich ausschließlich darauf, wo die Daten gespeichert werden. Ich kann nicht überall geeignet sehen, dass ist:

  1. Vorhersehbare (zB% APPDATA% \ Foo ist ein 'vorhersehbar' Weg, aber leider benutzerspezifisch)
  2. Global (zB% Programdata% \ Foo ist ein globaler Pfad aber leider nur das erstellen von Benutzern haben Schreibzugriff)
  3. Accessible (ein Standardbenutzer muss in der Lage sein, neue Dateien im angegebenen Verzeichnis zu erstellen, das für alle Benutzer des System gilt)

Antwort

2

Wenn Sie sich entscheiden, dass CSIDL_COMMON_APPDATA nicht geeignet ist (vielleicht ist CSIDL_COMMON_APPDATA ein guter Standard, aber Sie wollen, dass der Administrator in der Lage sein, um die Position zu ändern) können Sie das Installationsprogramm schreiben, etwas zu einem HKLM\SOFTWARE\<your app subkey> haben kann, die den gewünschten Pfad angibt, für das gemeinsame Verzeichnis, in dem die Daten gespeichert werden.

Eine Alternative zum Platzieren des Zeigers in der HKLM-Registrierung ist eine Konfigurationsdatei im Programmverzeichnis mit einem Zeiger auf das freigegebene Verzeichnis. Per Definition muss das Programmverzeichnis vom Installer beschreibbar sein, es kann von Administratoren geschrieben werden (die für die Änderung der Konfiguration verantwortlich sein könnten), und es ist für Benutzer lesbar. So kann ein Standardbenutzer einen bekannten Speicherort (entweder einen HKLM-Unterschlüssel oder eine Konfigurationsdatei im Programmverzeichnis) lesen, um einen Zeiger auf ein Verzeichnis zu erhalten, das für alle Standardbenutzer schreibbar ist.

Unabhängig von der Konfiguration des allgemeinen Verzeichnisses (Installationsprogramm oder Konfigurationsmodul) muss sichergestellt werden, dass die ACL des allgemeinen Verzeichnisses für Standardbenutzerschreibvorgänge entsprechend eingestellt ist.

+0

"Sie können das Installationsprogramm schreiben etwas in eine HKLM \ SOFTWARE \ " Ich habe dies in weit verbreiteten Desktop-Anwendungen getan. Ich lasse dem Installer Standardbenutzerrechte geben, um auf diesen Schlüssel zu schreiben. –

+1

@Jim: Ich erwähnte nicht, die ACL für einen HKLM-Unterschlüssel auf etwas zu setzen, das von Standardbenutzern schreibbar ist (was auch für ein Unterverzeichnis des Programmverzeichnisses getan werden könnte), weil ich denke, dass es allgemein als schlechte Praxis angesehen wird. Ich bin mir nicht sicher, ob ich dem zustimme. Ich dachte, es könnte auch ein Problem mit der Logo-Zertifizierung sein, obwohl ich nicht weiß, ob das korrekt ist oder nicht. –

-2

Optionen :

  1. Datei Mutex Zugriff auf die Datei
  2. Datenbank zum Speichern von Einstellungen Einstellungen
  3. Web Service zu steuern, zu speichern, die Gleichzeitigkeit
+0

Mein Problem ist nicht mit der Synchronisation zu tun, sondern mit der Tatsache, dass ich nicht irgendwo global finden kann, dass ein Nicht-Administrator tatsächlich Daten schreiben kann. – RaptorFactor

1

versuchen, die öffentlichen Ordner in dem Benutzer verarbeiten kann Profilverzeichnis:

CSIDL_COMMON_DOCUMENTS 

Edit: Oder nutzen

CSIDL_COMMON_APPDATA 

, setzen Sie die Berechtigungen jedoch nach Möglichkeit auf die Gruppe Authentifizierte Benutzer.

1

Sie suchen wahrscheinlich nach CSIDL_COMMON_APPDATA. IIRC, das sollte auch eine gute Wahl sein, sollten Sie für eine der Windows-Logo-Zertifizierungen gehen. Wenn es nicht Ihren Anforderungen entspricht, überprüfen Sie this link on MSDN, Sie sollten in der Lage sein, dort die beste Lösung für Ihre Bedürfnisse zu finden.
Viel Glück.

+0

Übrigens: Sie sollten es vermeiden, sensible Benutzerdaten in diesem Verzeichnis zu speichern. – Dmitry

1

Können Sie nicht einfach einen festen Verzeichnisnamen verwenden, z. c: \ FixedDataForYourProgram

Wir tun dies auf XP. Ich habe das programmatisch nicht unter Vista/Win7 probiert, aber als Standardbenutzer unter Vista angemeldet. Ich habe kein Problem, ein Verzeichnis unter root zu erstellen.

Ich bin sicher, dass dies alle Arten von Regeln bricht, aber es ist einfach. Ich mag einfach.

+0

Einfach ... und chaotisch. Es macht es für die Anwendung noch schwieriger, über die Migration des Benutzerstatus hinweg zu arbeiten, wenn Roaming-Benutzerprofile vorhanden sind. – reuben

+0

Aber die Frage möchte einen festen Standort. Dies entspricht den angegebenen Anforderungen (vorhersehbar/global/zugänglich). Zu viel Mühe geht auf die Lösung von Problemen, die niemals entstehen. – IanH