2012-04-22 6 views
5

Ich habe eine Anwendung, die ihre Einstellungen Verzeichnis im% APPDATA% Verzeichnis des Benutzers erstellen muss. Dazu verwendet es Code ähnlich dem folgenden:Anwendung kann nicht schreiben in% APPDATA% (aber Benutzer kann)

std::string appDataBase = getenv("APPDATA"); 
std::string appDir = appDataBase + "\\MyDir"; 

std::cerr << "About to invoke _mkdir(" << appDir << ")" << std::endl; 
int rv = _mkdir(appDir.c_str()); 
std::cerr << "_mkdir returned " << rv << ", errno = " << errno << std::endl; 

Wenn jedoch dieser Code ausgeführt wird, der _mkdir Aufruf fehlschlägt und errno wird auf EACCES:

About to invoke _mkdir(C:\Users\mdm\AppData\Roaming\MyDir) 
_mkdir returned -1, errno = 13 

Ich hätte angenommen, dies ist ein Einfaches Berechtigungs-Problem, abgesehen von der Tatsache, dass (1) ich das Verzeichnis manuell im Explorer ohne irgendwelche Berechtigungsprobleme erstellen kann, und (2) der exakt gleiche Code funktioniert, wenn ich ihn selbst in ein Projekt kopiere.

Ich habe umfangreiche Suche nach Informationen zu diesem Problem durchgeführt, kann aber nur Diskussionen über allgemeine Berechtigungsprobleme finden, z. B. dass der Benutzer nicht mit Explorer auf diesen Ordner zugreifen/in diesen Ordner schreiben kann. Der Code in meiner Anwendung funktioniert, wenn ich ihn als Administrator ausfühle, also ist klar, dass etwas mit seinen Berechtigungen passiert, aber ich weiß nicht, was ich sonst noch überprüfen soll. Ich habe mit Process Explorer überprüft und bestätigt, dass die Anwendung mit meinem Benutzerkonto ausgeführt wird, das über vollständige Schreibberechtigungen in das% APPDATA% -Verzeichnis verfügt, und ich habe sichergestellt, dass die% APPDATA% -Baumstruktur nicht auf Versteckt oder Schreibgeschützt gesetzt ist.

Gibt es eine Art "effektive Benutzer-ID" oder "effektive Berechtigungen", die für eine Windows-Anwendung festgelegt werden können, die von etwas in der Erstellungskonfiguration oder Prozessinitialisierung abhängen kann? Gibt es weitere Faktoren, die verhindern, dass eine bestimmte Anwendung in% APPDATA% schreibt, während andere Benutzerprozesse dies können?

aktualisieren

Weitere Untersuchungen zeigen, dass der Unterschied im Verhalten nicht auf den Inhalt des Codes verwendet ist, aber der Speicherort der ausführbaren im Dateisystem. Meine Anwendung wird aus einer Quellstruktur in einem Ordner Development in meinem Benutzerverzeichnis erstellt, und der Aufruf _mkdir schlägt für ausführbare Dateien in diesem Verzeichnis fehl; Das Kopieren der EXE-Datei in ein neues Verzeichnis C:\Development ermöglicht es jedoch, ordnungsgemäß zu funktionieren (obwohl das Verschieben des vorhandenen Development-Verzeichnisses nicht möglich ist). Das einfache Testprogramm war innerhalb Documents\Visual Studio\Projects, das scheint auch ein zufriedenstellender Ort zu sein.

+0

"derselbe Code funktioniert gut, wenn ich ihn in ein Projekt selbst kopiere" - dann machen Sie wahrscheinlich etwas Interessantes im umgebenden Code. Ich kann mir nicht vorstellen, was es ist. – Mat

+0

@Mat: Das wäre meine Vermutung - leider habe ich wenig Erfahrung bei der Entwicklung von Windows, so dass ich nicht sicher bin, was ich im umgebenden Code suchen soll. –

+0

Versuchen Sie als Debugging-Maßnahme mit Process Monitor (Durchsuchen der MS-Website), den Pfad zu überprüfen, den das System tatsächlich zu erstellen versucht, und welcher Fehlercode vom Dateisystem zurückgegeben wird. Es mag eine Art Umleitung geben, obwohl ich nicht verstehe, warum das hier der Fall sein sollte. –

Antwort

0

Windows verfügt über verschiedene (und umfangreiche) Funktionen zum Ändern von Sicherheitskontexten. Siehe unter here für einige.

Vielleicht verändert das Projekt mit diesem Code die Sicherheitskontexte? Wenn das Programm als öffentlich zugänglicher Server ausgeführt wird, hätte ich zum Beispiel erwartet, dass es ImpersonateAnonymousToken() aufruft.

Verwandte Themen