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)
This commit is contained in:
+27
-12
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user