Mémoire partagée les autorisations d'accès sur Windows
J'ai développé une application windows qui utilise la mémoire partagée------les fichiers mappés en mémoire pour la communication interprocessus. J'ai un service windows qui fait du traitement et périodiquement écrit des données dans le fichier mappé en mémoire. J'ai séparé application windows qui lit le fichier mappé en mémoire et affiche les informations. L'application fonctionne comme prévu sur Windows XP, XP Pro et Server 2003, mais PAS sur Vista.
Je peux voir que les données écrites sur le fichier mappé en mémoire se passe correctement par le service windows parce que je peux ouvrir le fichier avec un éditeur de texte et de voir les messages, mais le "consommateur" de l'application ne peut pas lire le fichier. Une chose intéressante à noter ici, c'est que si je ferme l'application du consommateur et de le redémarrer, il consomme les messages qui ont déjà été écrites sur le fichier mappé en mémoire.
Aussi, une autre chose étrange est que je reçois le même problème lorsque je me connecte à l'hôte windows à l'aide de Bureau à Distance et appeler/utilisation de l'application du consommateur via le bureau à distance. Cependant, si j'invoque le Bureau à Distance et de se connecter à l'hôte cible de la session de la console avec la commande suivante: mstsc -v:servername /F -console
, tout fonctionne parfaitement.
C'est pourquoi je pense que le problème est lié à des autorisations. Quelqu'un peut-il commenter?
EDIT:
L'ACL que j'utilise pour créer le fichier mappé en mémoire et les Mutex les objets synchroniser l'accès est comme suit:
TCHAR * szSD = TEXT("D:")
TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)")
TEXT("(A;;GA;;;BG)")
TEXT("(A;;GA;;;AN)")
TEXT("(A;;GA;;;AU)")
TEXT("(A;;GA;;;LS)")
TEXT("(A;;GA;;;RD)")
TEXT("(A;;GA;;;WD)")
TEXT("(A;;GA;;;BA)");
Je pense que cela peut être une partie de la question.
OriginalL'auteur James Whetstone | 2008-10-06
Vous devez vous connecter pour publier un commentaire.
J'ai donc trouvé la solution à mon problème:
Sur Windows XP, tous les noms de noyau des objets tels que des mutex, sémaphore et mappé en mémoire les objets sont stockés dans le même espace de noms. Ainsi, lorsque les différents processus dans les différentes sessions de l'utilisateur référence à un objet particulier en utilisant son nom, ils obtenir un handle de l'objet. Toutefois, par mesure de sécurité, les services terminal server Windows crée un namespace pour les objets noyau référencé à partir de processus a commencé dans sa session. Windows Vista a ce comportement sont intégrés en tant que bien, et c'est pourquoi, mon application ne fonctionne pas correctement sur Vista. D'élaborer, j'ai un service Windows qui s'exécute dans la session null et une application qui s'exécute dans une session d'utilisateur, de sorte que mes objets nommés ont été créés dans les espaces de noms distincts.
La solution rapide à ce problème était de utiliser l'espace de noms Global en ajoutant le "Global\" pour chaque noyau, nom de l'objet que j'ai utilisé et qui a fait le tour.
Eh bien, il ya mixte des pensées sur celui-là. Il ya des moments où vous voulez offrir un service supérieur des droits et de la capacité ( disons Système Local) qu'un utilisateur de l'application qui doit être en mesure de faire l'interface avec le service. Défendable vous permettant de sécurité que de donner le service et non pas l'application de tous les accès. Toutefois, vous pouvez afficher le fait que le service existe aussi un risque de sécurité. Mais je suis en désaccord.
OriginalL'auteur James Whetstone
Le préfixe "Global\" ne peut pas travailler sur la mémoire partagée. Voir "L'Impact de la Session 0 Isolement sur les Services et les Pilotes dans Windows Vista" pour la solution.
OriginalL'auteur
D'accès sont vous de l'ouverture de la mémoire partagée de la section? Essayez avec
FILE_MAP_ALL_ACCESS
et de travailler votre chemin vers le bas. Assurez-vous également que vous n'avez pas une condition de concurrence entre les producteurs et les consommateurs - qui est la création de la mémoire partagée? Assurez-vous que sat est créé avant que l'autre essaie de l'ouvrir. Une méthode consiste à créer la section du parent avant de commencer le processus de l'enfant - si vous utilisez un parent/enfant architecture.Votre enfant pourrait avoir besoin pour exécuter élevée sur Vista afin d'être autorisés à accéder à la mémoire partagée. Elle peut aussi être liée à la fenêtre de session que vous utilisez. Services dans la session 0 (je crois) alors que d'autres applications (surtout si vous vous connectez via le bureau à distance) peuvent s'exécuter dans une autre session.
OriginalL'auteur 1800 INFORMATION
Avez-vous essayé de déplacer le fichier vers un emplacement différent. Essayez de le mettre dans les "Documents Partagés" dossier, ce qui semble être le plus librement accessibles dossier dans Vista.
OriginalL'auteur jmatthias