2016-05-31 1 views
0

J'ai écrit une DLL en cours de chargement dans un processus de service s'exécutant en tant que système local. Ne devrais-je pas être en mesure de supprimer les fichiers que je crée?DeleteFile échoue après CreateFile/Close handle dans le compte de service SYSTEM

HANDLE hFile = CreateFileW(m_achTempFilePath, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; 

réussit. alors je cours CloseHandle(hFile)

et DeleteFile(m_achTempFilePath)

Supprimer le fichier échoue avec l'accès refusé.

J'ai exécuté ce qui suit et transmis &sa en tant qu'attributs de sécurité à CreateFile, puis DeleteFile réussit. Mais cela donne à tout le monde un contrôle total. Je ne veux pas ça.

Quelle est la bonne façon de le faire?

CDacl dacl; 
dacl.AddAllowedAce(Sids::World(), SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL) ; 
CSecurityDesc sd; 
sd.SetDacl(dacl); 
CSecurityAttributes sa; 
sa.Set(sd, true); 
+0

Pour le dossier où les fichiers temporaires sont créés, ses autorisations peuvent-elles être définies pour refuser spécifiquement une opération "Supprimer" (tout en autorisant d'autres opérations)? Pour vérifier cela, vous pouvez explorer le menu contextuel "Propriétés" du dossier dans l'Explorateur et continuer à choisir les vues "Avancées" pour l'utilisateur du SYSTÈME jusqu'à ce que vous voyiez "Supprimer" séparé des autres opérations. –

+0

Comment puis-je voir les autorisations pour l'utilisateur du système sans prendre possession du répertoire? J'ai suivi les instructions [ici] (http://superuser.com/questions/172437/run-explorer-in-system-account-on-windows-vista-or-7-using-sysinternal-s-psexec). Il démarre le menu Démarrer en tant que système, mais il lance toujours l'interface utilisateur de l'explorateur pour parcourir le système de fichiers en tant que compte d'utilisateur local. Le répertoire est c: \ ProgramData \ Microsoft \ Search \ Data \ Temp \ usgthrsvc si vous voulez vérifier sur votre ordinateur local. – tdemay

+0

Correction ... J'ai oublié. Je suis passé à C: \ ProgramData ... J'ai créé un répertoire sous le répertoire de données de l'application commune. Vous pouvez y créer des répertoires et des fichiers, mais vous ne pouvez pas les supprimer dans le compte de service fonctionnant en tant que système local. – tdemay

Répondre

0

Vous pouvez toujours utiliser le drapeau FILE_FLAG_DELETE_ON_CLOSE dans votre méthode de création de fichier. De cette façon, lorsque vous fermez le handle du fichier, il se nettoie. Le problème lui-même peut être un problème de noyau basé sur le timing avec Windows.

Ce travail autour devrait résoudre le problème.

+0

J'ai besoin d'une solution au problème des autorisations. Pas un travail autour. Ce n'est pas un problème de synchronisation. Je ne peux pas supprimer les fichiers créés lors de l'exécution dans ce contexte de sécurité. Je ne peux pas supprimer ou renommer les fichiers créés par GetTempFileName non plus. – tdemay