From 059cf44ab73fbf7616699b8832f08d96314b5696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= Date: Fri, 21 May 2010 17:28:52 +0000 Subject: [PATCH] Fixed an UnauthorizedAccessException in the StartupManager. The exception occurred when the application was running without administrator rights. A task for the current user could be created manually, but RegisterTaskDefinition somehow always throws an UnauthorizedAccessException. The current fix restricts the TaskScheduler startup method to accounts with administrator rights. System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) at OpenHardwareMonitor.TaskScheduler.ITaskFolder.RegisterTaskDefinition(String Path, ITaskDefinition pDefinition, Int32 flags, Object UserId, Object password, TASK_LOGON_TYPE LogonType, Object sddl) at OpenHardwareMonitor.GUI.StartupManager.CreateSchedulerTask() at OpenHardwareMonitor.GUI.StartupManager.set_Startup(Boolean value) at OpenHardwareMonitor.GUI.MainForm.runOnWindowsStartupToolStripMenuItem_CheckedChanged(Object sender, EventArgs e) at System.Windows.Forms.ToolStripMenuItem.OnCheckedChanged(EventArgs e) at System.Windows.Forms.ToolStripMenuItem.set_CheckState(CheckState value) at System.Windows.Forms.ToolStripMenuItem.set_Checked(Boolean value) at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e) at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e) at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met) at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.ToolStrip.WndProc(Message& m) at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) --- GUI/StartupManager.cs | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/GUI/StartupManager.cs b/GUI/StartupManager.cs index 1318a2a..425131c 100644 --- a/GUI/StartupManager.cs +++ b/GUI/StartupManager.cs @@ -38,6 +38,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Security.Principal; using System.Windows.Forms; using Microsoft.Win32; using OpenHardwareMonitor.TaskScheduler; @@ -51,25 +52,39 @@ namespace OpenHardwareMonitor.GUI { private const string REGISTRY_RUN = @"Software\Microsoft\Windows\CurrentVersion\Run"; - public StartupManager() { + private bool IsAdministrator() { try { - scheduler = new TaskSchedulerClass(); - scheduler.Connect(null, null, null, null); + WindowsIdentity identity = WindowsIdentity.GetCurrent(); + WindowsPrincipal principal = new WindowsPrincipal(identity); + return principal.IsInRole(WindowsBuiltInRole.Administrator); } catch { - scheduler = null; + return false; } + } - if (scheduler != null) { + public StartupManager() { + if (IsAdministrator()) { try { - ITaskFolder folder = scheduler.GetFolder("\\Open Hardware Monitor"); - IRegisteredTask task = folder.GetTask("Startup"); - startup = task != null; - } catch (IOException) { - startup = false; - } catch (UnauthorizedAccessException) { + scheduler = new TaskSchedulerClass(); + scheduler.Connect(null, null, null, null); + } catch { scheduler = null; } - } + + if (scheduler != null) { + try { + ITaskFolder folder = scheduler.GetFolder("\\Open Hardware Monitor"); + IRegisteredTask task = folder.GetTask("Startup"); + startup = task != null; + } catch (IOException) { + startup = false; + } catch (UnauthorizedAccessException) { + scheduler = null; + } + } + } else { + scheduler = null; + } if (scheduler == null) { RegistryKey key = Registry.CurrentUser.OpenSubKey(REGISTRY_RUN);