2010-04-02 8 views
3

J'essaie d'utiliser le code suivant (mal écrit, mais ce n'est qu'une preuve de concept) pour modifier le registre d'un ordinateur sur un domaine. J'ai un compte de domaine, et j'ai vérifié que le groupe d'administration de domaine est présent dans le groupe d'admin local sur les machines que j'essaye d'affecter. Je me suis connecté à ces autres machines pour effectuer d'autres tâches de type administratif, donc je suis sûr que j'ai des privilèges administratifs sur ces machines. Toutes les méthodes "get" de StdRegProv fonctionnent bien (http://msdn.microsoft.com/en-us/library/aa393664%28VS.85%29.aspx) mais les méthodes "set" ou "create" ainsi que la vérification d'accès renvoient toutes "5" qui est "Error_Access_Denied" selon winerror.h. Il y a donc le problème: pourquoi est-ce que l'accès est refusé quand j'essaie de modifier le registre? Si quelqu'un peut m'aider à comprendre cela, vous aurez ma plus grande appréciation! J'ai presque oublié, quand je lance Visual Studio en mode admin sur ma machine locale et exécute le code sur la machine locale, cela fonctionne parfaitement. Si je ne démarre pas en mode administrateur sur la machine locale, le code échoue, donc je soupçonne qu'il y a peut-être un problème d'UAC?WMI: Modification du Registre à distance

MISE À JOUR: En utilisant regedit et la connexion à l'ordinateur distant, je peux changer la clé de Registre qui me porte à croire que ce n'est pas une question UAC, mais il exécute avec une connexion WMI locale lors de l'exécution en mode élevé sur ma propre machine, alors peut-être que c'est UAC. De plus, les machines winXP renvoient le même code d'erreur (5, ERROR_ACCESS_DENIED) ce qui m'amène à croire que ce n'est pas du UAC ... c'est nul. Résolu: L'objet ManagementClass utilise le mauvais remplacement; il doit être paramétré avec ManagementScope, sinon vous exécutez simplement des fonctions localement.

ManagementClass mc = new ManagementClass(scope, new ManagementPath("StdRegProv"), null); 

Oui, je suis une épopée-fail:/9K lignes de code, et cette ligne me tenait le plus long de tous.

using System; 
using System.Management; 


public class EditRemoteRegistry 
{ 
    public static void Main(string[] args) 
    { 
     ConnectionOptions options = new ConnectionOptions(); 
     options.EnablePrivileges = true; 
     options.Impersonation = ImpersonationLevel.Impersonate; 
     options.Password = "password goes here"; 
     //options.Authority = "my company's domain"; 
     //options.Username = "Admin username"; 

     ManagementScope scope = new ManagementScope("\\\\arbitraryhost\\root\\default", options); 
     scope.Connect(); 

     ManagementClass mc = new ManagementClass("StdRegProv"); 

     ManagementBaseObject inParams = mc.GetMethodParameters("CreateKey"); 
     inParams["hDefKey"] = (UInt32)2147483650; 
     inParams["sSubKeyName"] = "Software\\Test"; 
     ManagementBaseObject outParams = mc.InvokeMethod("CreateKey", inParams, null); 
     //Should return a 0, but returns a 5, "Error_Access_Denied" 
     Console.WriteLine("CreateKey Method returned " + outParams["returnValue"]); 

     //This chunk works fine 
     ManagementBaseObject inParams5 = mc.GetMethodParameters("GetDWORDValue"); 
     inParams5["hDefKey"] = 2147483650; 
     inParams5["sSubKeyName"] = "Software\\Test"; 
     inParams5["sValueName"] = "testDWORDvalue"; 
     ManagementBaseObject outParams5 = mc.InvokeMethod("GetDWORDValue", inParams5, null); 
     Console.WriteLine("GetDWORDValue returned " + (UInt32)outParams5["returnValue"] + " "); 
     Console.WriteLine((UInt32)outParams5["uValue"]); 


     ManagementBaseObject inParams6 = mc.GetMethodParameters("SetStringValue"); 
     inParams6["hDefKey"] = 2147483650; 
     inParams6["sSubKeyName"] = "Software\\Test"; 
     inParams6["sValueName"] = "TestStringValue"; 
     inParams6["sValue"] = "Hello World!"; 
     ManagementBaseObject outParams6 = mc.InvokeMethod("SetStringValue", inParams6, null); 
     //Should return a 0, but returns a 5, "Error_Access_Denied" 
     Console.WriteLine("SetStringValue returned " + outParams6["returnValue"]); 

     Console.ReadKey(); 
    } 
} 

Répondre

2

Vous pouvez également désactiver le filtrage à distance UAC.

La désactivation de l'UAC distant en modifiant l'entrée de registre qui contrôle l'UAC distant n'est pas recommandée, mais peut être nécessaire dans un groupe de travail. L'entrée de registre est HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ system \ LocalAccountTokenFilterPolicy. Lorsque la valeur de cette entrée est zéro (0), le filtrage des jetons d'accès UAC à distance est activé. Lorsque la valeur est 1, l'UAC distant est désactivé.

http://msdn.microsoft.com/en-us/library/aa826699(VS.85).aspx

+0

Bon conseil, mais malheureusement, UAC doit être activé sur l'ensemble du domaine par la politique. En outre, la machine ne nécessite-t-elle pas un redémarrage après la modification de la valeur de Registre? – Quanta

+0

Oui, il faudrait redémarrer. On dirait qu'il devrait y avoir un moyen de contourner cela ... –

+0

Avez-vous essayé d'ajouter votre utilisateur au groupe d'administrateur local? Selon le lien que j'ai posté: «Si votre ordinateur fait partie d'un domaine, connectez-vous à l'ordinateur cible à l'aide d'un compte de domaine situé dans le groupe Administrateurs local de l'ordinateur distant. Le filtrage des jetons d'accès UAC n'affecte pas les comptes de domaine dans le groupe Administrateurs local. " Je ne sais pas si cela serait possible dans votre cas. –

0

Il semble qu'il y ait des problèmes en cours d'exécution setters WMI contre les machines avec contrôle de compte sur.

citation

D'après les rapports que nous recevons du terrain, il semble UAC doit être désactivé pour les requêtes WMI à distance pour travailler. Avec l'UAC en cours d'exécution, un compte d'administrateur dispose en réalité de deux jetons de sécurité, d'un jeton d'utilisateur normal et d'un jeton d'administrateur (qui n'est activé que lorsque vous passez l'invite UAC). Malheureusement, les requêtes distantes qui arrivent sur le réseau obtiennent le jeton d'utilisateur normal pour l'administrateur et, comme il n'y a aucun moyen de gérer à distance une invite UAC, le jeton ne peut pas être élevé au jeton de sécurité true-administrator.

source: http://www.poweradmin.com/help/enableWMI.aspx

Tentez de modifier la clé de Registre de la machine distante:

HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ system \ LocalAccountTokenFilterPolicy.

0 - construire jeton (à distance l'UAC est activé) 1 filtré - construire jeton élevé (à distance UAC désactivé)

+0

C'est le problème, je ne peux pas modifier à distance la clé parce que l'UAC est activée. Je vais exécuter ce code sur des milliers sur des machines, et ils sont tous tenus d'exécuter UAC malheureusement:/ – Quanta

Questions connexes