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();
}
}
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
Oui, il faudrait redémarrer. On dirait qu'il devrait y avoir un moyen de contourner cela ... –
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. –