Mon OS est Vista avec l'UAC activé, je crée un objet global de mutex côté serveur, puis mon AP avec l'interface utilisateur veut utiliser CreateMutex avec le même nom pour obtenir l'objet Mutex qui a été créé dans le serveur , mais la fonction me dit que je n'ai pas le droit d'y accéder. Comment puis-je le faire?A propos mutex dans Vista
Répondre
Je pense que dans votre cas, vous devez autoriser explicitement tout accès à votre mutex via l'initialisation des attributs de sécurité correspondants.
Essayez de créer mutex de cette façon (le considérer comme semi-pseudo-code):
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = &sd;
CreateMutex(&sa, ...);
Et en passant - il est correct d'utiliser CreateMutex pour ouvrir un existant mutex. Mais, OpenMutex vous permet de spécifier le niveau d'accès requis.
Notez également que si vous avez besoin d'un mutex vraiment global - vous devez préfixer son nom avec (article reportez-vous aux « espaces de noms d'objets du noyau » de MSDN) « Global \ »
Eh bien, ce n'est pas une bonne pratique: imaginez que vous ayez une DLL hook globale à initialiser et à accéder au même mutex - OpenMutex n'est pas pratique dans ce scénario. Mais si dans votre code la création d'un mutex et l'accès à ce mutex peuvent être facilement séparés - alors le code sera plus clair si CreateMutex crée et OpenMutex ouvre le mutex existant avec les droits d'accès désirés – Andrey
Merci, ça va bien maintenant. –
Êtes-vous en cours d'exécution du serveur et la Interface utilisateur sur la même machine Vista? –
Oui, le gros problème est que l'interface utilisateur n'a pas besoin d'accéder au MUTEX qui a été créé par le serveur car le Mutex existant a plus de droits que l'interface utilisateur SW. –