public class ManageComp
{
ManagementObject _moOpSystem;
public ManageComp()
{
ManagementScope scope = new ManagementScope(
"\\\\.\\root\\cimv2",
new ConnectionOptions() { EnablePrivileges = true });
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, query);
foreach(ManagementObject m in searcher.Get())
{
_moOpSystem = m;
}
}
public void RebootComputer()
{
_moOpSystem.InvokeMethod("Reboot", null);
}
}
static class Program
{
public static ManageComp ManComp = new ManageComp();
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
new Thread(new ThreadStart(delegate()
{
Application.Run(new FormMain()
{
Text = "Another Thread"
});
})).Start();
Application.Run(new FormMain()
{
Text = "Main Thread"
});
}
}
タイトルが「メインスレッド」のフォームから RebootComputer を呼び出すと、コンピューターは正常に再起動しますが、タイトルが「別のスレッド」のフォームから同じメソッドを呼び出すと、「特権が保持されていません」という例外が発生します
ここにボタンクリックコードがあります
private void button1_Click(object sender, EventArgs e)
{
Program.ManComp.RebootComputer();
}
どうすればこの奇妙な問題を克服できますか? なぜそれが起こっているのですか?