7
votes

Problème d'autorisations lors de la publication de WMI sous Compte de service réseau

J'ajoute de la publication WMI à un service Windows basé sur le fichier .NET Framework 3.5 sous le compte "Service de réseau".

Selon un Document Je suis apparu sur MSDN , le compte" Service de réseau "doit par défaut avoir des autorisations de publication WMI. (" Par défaut, les utilisateurs et les groupes suivants sont autorisés à publier des données et des événements: ... Service réseau STRUT>, ... EM>") P>

Toutefois, lorsque le service appelle l'instrumentation.Publish (mystatusclassinstance), il jette une répertoireNotFoundException; p> xxx pré>

.. donc cela ressemble à System.Management.Instrumentation tente de générer du code sur la Fly, et lors de la course sous le service réseau, il cible un répertoire où le service réseau n'a aucune autorisation. P>

Quelle est la meilleure solution / solution de contournement pour cela? Puis-je remplacer le Dir cible de code-gen dans App.config ou en code? Je ne veux pas avoir à jouer avec des autorisations de système de fichiers lors du déploiement du service ... p>

Mise à jour forte>: Je pense que c'est une «fonctionnalité» où des affrontements de code FX plus ancien avec les nouveaux paramètres de sécurité à Win7. En interne, les classes gérés WMI récupèrent le répertoire d'installation WMI du registre et utilisent cela comme chemin de sortie pour le code généré. Malheureusement, beaucoup d'utilisateurs ne sont pas autorisés (ou supposés) écrire des trucs sous% Systemroot% ... ... J'ai déposé un bogue de connexion ( # 530392 ) Pour voir si MSFT peut apporter une clarté et / ou fournir un correctif ou une solution de contournement. P>

Mise à jour 2: strong> Je suppose que pour les comptes d'utilisateurs normaux, ce n'est pas un problème, car la virtualisation de l'UAC enregistrera et stockera les fichiers ailleurs. Cependant, apparemment, le compte "Service de réseau" n'est pas couvert par la virtualisation de l'UAC. Contraintes simples: .NET Framework 3.5 Service Windows basé sur Windows, fonctionnant en tant que service réseau, doit pouvoir publier des données via WMI à l'aide de System.Management.instrumentation sur Win7 et Win2008 [RTM & R2] avec des autorisations / paramètres de sécurité par défaut et sans recourir à Modification des membres du cadre interne / privé à l'aide de la réflexion. «Outils» mais propres solutions bienvenues. Ouvrira une deuxième génération liée à un espace réservé à un autre 550PT si le permet le permet. P>

Mise à jour de Bounty: Strong> J'ai l'intention de doubler la prime de cette Q à travers une seconde main QUESTION PARFONNÉE QUI SERVONS ÊTRE COMME UN BONTY EMPLACTEUR:
https://stackoverflow.com/questions/2208341/bounty-lagder (

Mise à jour 4: Strong> Cela va de mieux en mieux. J'ai remarqué que l'installationtil écrivait les fichiers manquants sur C: \ Windows \ Syswow64 ... etc ..., alors j'ai réalisé que j'avais l'aide de la version 32 bits d'installutil pour installer le service, mais le service était en cours d'exécution. Processus 64 bits. L'effet secondaire évident était que le code généré lors de l'exécution de l'installation d'installation est terminé sous SYSWOW64 (le répertoire système 32 bits), tandis que le service l'ait recherché dans le répertoire système 64 bits (System32). (

J'ai donc essayé d'installer le service avec la version 64 bits d'installutil. Cela a échoué misérablement avec des erreurs de permission dans la% sysroot% \ wbem \ framework ... etc ... chemin. Ensuite, j'ai recompilé le service comme x86 et l'inscrit à nouveau à l'aide de la version 32 bits d'installutil. Cela a abouti à une exception entièrement nouvelle: P>

System.Exception: The code generated for the instrumented assembly failed to compile.
   at System.Management.Instrumentation.InstrumentedAssembly..ctor(Assembly assembly, SchemaNaming naming)
   at System.Management.Instrumentation.Instrumentation.Initialize(Assembly assembly)
   at System.Management.Instrumentation.Instrumentation.GetInstrumentedAssembly(Assembly assembly)
   at System.Management.Instrumentation.Instrumentation.GetPublishFunction(Type type)
   at System.Management.Instrumentation.Instrumentation.Publish(Object instanceData)
   at SomeService.InstanceClass.PublishApp(String name) in e:\work\clientname\SomeService\SomeService\WMIProvider.cs:line 44
   at SomeService.SomeServiceService..ctor() in e:\work\clientname\SomeService\SomeService\SomeServiceService.cs:line 26
   at SomeService.Program.Main() in e:\work\clientname\SomeService\SomeService\Program.cs:line 17


2 commentaires

Êtes-vous sûr que l'échec est-il par des droits d'accès? Je suggère des outils Sysinternals.


Bon point. Je faisais cette hypothèse basée sur le service de réseau et la plupart des autres utilisateurs ne sont plus autorisés à écrire / créer sous% Systemroot% ... ... Je vérifierai si je peux trouver une preuve de cette exception éventuellement masquant une autre ...


3 Réponses :


2
votes

Je crois que le problème n'est pas avec les données de publication, mais avec Enregistrement ce type dans WMI pour la première fois.

Si vous examinez le code System.Management.Instrumentation Code dans Réflecteur ou d'autres désassemblistes, vous verrez que Wen l'assemblage sur le point de publier n'a pas été enregistré, le code essaiera d'enregistrer l'assemblage et de sauvegarder les informations de montage dans un sous-répertoire Sous spécialement nommé Sous le dossier d'installation WBEM.

Je soupçonne que si vous exécutez le code pour publier les données WMI en tant qu'administrateur, elle enregistrerait l'assemblage, puis le compte de service réseau aurait les autorisations pour faire la publication normale.


2 commentaires

Il se rapporte comme étant enregistré (le dit PLOWUTIL, de toute façon). En outre, appeler Instrumentation.L'aSTAmbly Regarded revient vrai, donc au moins, il pense il est enregistré. L'exception est soulevée lorsque j'appelle Instrumentation.Publie.


ISASSASSELLABIBLIBLIBLIME REGLIT LE RETOURIT VRAI, mais l'enregistrement de l'inscription jette la même exception que Publier. Alors oui, tu es à quelque chose là-bas ... :)



2
votes

Avez-vous inspecté votre assemblée avec le installutil < / a>? Cela devrait vous donner un journal des problèmes d'installation. (Mais puisque vous ne pouvez pas l'exécuter comme le compte de service réseau, cela pourrait ne pas afficher le problème que vous rencontrez.)

Aussi, êtes-vous sûr que ce service doit être exécuté sous le compte de service réseau?

En raison du risque de vulnérabilité dans l'exécution de services Windows dans des comptes privilégiés, Microsoft a rendu ces comptes de services spéciaux avec certaines limitations, qui ont été renforcées dans Vista et Win7. Depuis Vista, Microsoft a limité le nombre de services exécutant sous ce compte en faveur de ceux moins privilégiés (voir Cet article ). Le compte de service réseau (AKA "NT Authority \ Network Service") peut accéder au réseau (acteur en tant que pcname de compte de la machine locale $), mais il a réduit les droits sur la machine locale (contrairement au compte système local).

Avez-vous vérifié les autorisations de sécurité WMI pour la succursale utilisée par votre assemblage? Exécutez wmimgmt.msc et creuser. .. Lorsque j'ai fait une vérification rapide de certaines branches aléatoires, je pouvais voir que le compte de service réseau n'avait pas de droits d'écriture.

Enfin, je suggérerais d'utiliser procmon Sysinternals , lequel vous permettrait de filtrer à ce processus et de voir s'il existe des erreurs refusées dans les paramètres de fichier ou de registre. Cet outil a résolu de nombreux problèmes pour moi au fil des ans.


2 commentaires

Merci pour la réponse. InstallUtil ne signale que le succès. Procmon signale la même chose que l'exception dans la question; Createfile échoue sur le chemin non trouvé ... Je vais regarder dans les autorisations WMI ...


Le service réseau n'a pas eu de droits d'écriture complets dans l'espace de noms WMI que j'allais écrire, alors je lui ai donné ces droits. Cependant, cela n'a malheureusement pas résolu le problème.



1
votes

Je ne sais pas si vous l'avez élevé ou que quelqu'un d'autre, mais s'il vous plaît jeter un oeil: http://connect.microsoft.com/visualstudio/feedback/details/530392/wmi-publishing-fr Erreur sur permission-Erreur-VEUILLE-FOURNISE-FOURNIR-A-WAY-OUVERT-OUVERADE-CODEPATH-SYSTÈME-SYSTÈME-SYSTÈME-INSTRUMATION-INTRICATION-INTRAND-CONFIG-CONFIG-CONFIG

Cela peut vous aider à comprendre la cause première de la question meilleure


1 commentaires

Oui, je suis celui qui a déposé que connecter le bogue. J'ai inclus un lien vers elle dans la question aussi ...