ServiceController的权限,在Windows7
-
28-09-2019 - |
题
我有一个应用程序,它包括服务和一个可执行的。基本上这是一个形式的应用程序,负责开始,并停止服务在特定情况。
在Windows XP的应用程序管理的这个好用下列代码:
ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();
但是,在Windows7,即使我已经开始应用程序管理员,我得到以下例外:
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()
有什么我可以做的编程方式若要解决这个吗?
解决方案
当您说自己以管理员的身份启动该应用程序时,是指管理员组中的帐户或通过请求管理员凭据的UAC提示吗?如果没有UAC凭据提示(或实际运行为管理员帐户,而不是管理员组中的帐户),则您的应用程序没有修改服务的许可,因此您看到的例外是正确的。
此示例代码可以检查您的应用程序是否作为管理员运行,如果没有,请启动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;
}
}
其他提示
您也可以尝试将UAC设置为您的应用程序 “以管理员身份运行” 在代码中。
仅供参考,如果你不明白,为什么它不工作在Vista或7甚至如果目前的用户是在管理员小组,这里是什么MSDN说
在Windows Vista,用户账户控制(UAC)确定权限的用户。如果你是一个成员建立管理员基,你被分配两个运行时间访问标记:一个标准的用户接入令牌和管理员接入令牌。通过默认的,你是在标准的用户作用。当你尝试执行的任务,需要管理权限,可以动态提升你的作用通过使用经同意对话框。代码,执行IsInRole方法不能显示同意对话框框。代码返回,假如果你是在标准的用户作用,甚至如果你是在建立管理员小组。你可以提升自己的特权,在你执行代码右击的应用程序标和指示要运行一个管理员。
我记得我很惊讶在第1时使用7(我从来没有使用Vista)。
不隶属于 StackOverflow