2010-10-08 84 views
12

我有一個由服務和可執行文件組成的應用程序。基本上它是一個表單應用程序,負責在特定情況下啓動和停止服務。Windows 7中的ServiceController權限

在Windows XP應用程序使用下面的代碼管理這個罰款:

ServiceController controller = new ServiceController(); 
controller.MachineName = "."; 
controller.ServiceName = "XXXXXXXXXX"; 
controller.Stop(); 
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10)); 
controller.Start(); 

但在Windows 7中,即使我已經啓動的應用程序作爲管理員,我得到以下異常:

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() 

有什麼我可以通過編程來解決這個問題嗎?

回答

13

當您說您以管理員身份啓動應用程序時,是指在管理員組中的帳戶下,還是通過請求管理員憑據的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; 
    } 
} 
+1

對不起是一個傻瓜 - 我用一個快捷方式啓動,並在我的一臺測試機上設置了這個快捷方式,以管理員身份運行(並提示輸入UAC),但在機器上我得到了這個異常,請適當修改快捷方式。 – 2010-10-08 16:01:27

1

僅供參考,如果你不明白爲什麼它不是在Vista中工作,或者即使當前用戶是管理員組中7,這裏是MSDN不得不說

在Windows Vista中,用戶帳戶控制(UAC)確定用戶的權限。如果您是內置管理員組的成員,則會爲您分配兩個運行時訪問令牌:標準用戶訪問令牌和管理員訪問令牌。默認情況下,您處於標準用戶角色。當您嘗試執行需要管理權限的任務時,可以使用「同意」對話框動態提升角色。執行IsInRole方法的代碼不顯示「同意​​」對話框。如果您處於標準用戶角色,即使您位於內置管理員組中,該代碼也會返回false。在執行代碼之前,您可以提升您的權限,方法是右鍵單擊應用程序圖標並指出您想以管理員身份運行。

我記得在使用7(我從來沒有使用過Vista)時,我感到非常驚訝。