autorisations ServiceController dans Windows 7
-
28-09-2019 - |
Question
I ont une application qui se compose d'un service et un exécutable. Essentiellement, il est une application de formulaires qui est responsable de démarrer et d'arrêter un service dans des circonstances spécifiques.
Sous Windows XP, l'application gère cette fin en utilisant le code suivant:
ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();
Mais sur Windows 7, même si j'ai commencé l'application en tant qu'administrateur, je reçois l'exception suivante:
System.InvalidOperationException: Cannot open XXXXXXXXXXXXX service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied
--- End of inner exception stack trace ---
at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
at System.ServiceProcess.ServiceController.Start(String[] args)
at System.ServiceProcess.ServiceController.Start()
Est-ce que je peux faire pour résoudre ce programme?
La solution
Quand vous dites que vous avez commencé l'application en tant qu'administrateur, voulez-vous dire sous un compte dans le groupe Administrateurs, ou via une identification d'administrateur invite que les demandes CCU? Sans les informations d'identification rapide UAC (ou en cours d'exécution en fait que le compte administrateur, et non un compte au sein du groupe Administrateurs), votre application ne dispose pas des autorisations pour modifier les services, de sorte que l'exception que vous voyez est correct.
Ce bit de code exemple peut vérifier si votre application est en cours d'exécution en tant qu'administrateur, et sinon, lancez une invite UAC.
public static class VistaSecurity
{
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;
}
public static Process RunProcess(string name, string arguments)
{
string path = Path.GetDirectoryName(name);
if (String.IsNullOrEmpty(path))
{
path = Environment.CurrentDirectory;
}
ProcessStartInfo info = new ProcessStartInfo
{
UseShellExecute = true,
WorkingDirectory = path,
FileName = name,
Arguments = arguments
};
if (!IsAdministrator())
{
info.Verb = "runas";
}
try
{
return Process.Start(info);
}
catch (Win32Exception ex)
{
Trace.WriteLine(ex);
}
return null;
}
}
Autres conseils
Vous pouvez également essayer de régler la UAC pour votre application " Exécuter en tant qu'administrateur ".
Pour votre information, si vous ne comprenez pas pourquoi cela ne fonctionne pas dans Vista ou 7, même si l'utilisateur actuel est dans le groupe d'administrateurs, voici ce que MSDN a à dire
Dans Windows Vista, User Account Control (UAC) détermine les privilèges d'un utilisateur. Si vous êtes membre du groupe Administrateurs intégré, vous reçoit deux jetons d'accès run-time: un accès utilisateur standard jeton et un jeton d'accès administrateur. Par défaut, vous êtes dans le rôle utilisateur standard. Lorsque vous essayez d'exécuter une tâche qui nécessite des privilèges d'administrateur, vous pouvez dynamiquement élever votre rôle en utilisant la boîte de dialogue de consentement. Le code qui exécute la méthode IsInRole ne pas afficher la boîte de dialogue de consentement. Le code retourne false si vous êtes dans le rôle utilisateur standard, même si vous êtes intégré dans le groupe Administrateurs. Vous pouvez élever vos privilèges avant d'exécuter le code en cliquant droit sur l'icône de l'application et indiquer que vous souhaitez exécuter en tant qu'administrateur.
Je me souviens été très surpris au 1er lorsque vous utilisez 7 (je jamais utilisé Vista).