1
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();
}

どうすればこの奇妙な問題を克服できますか? なぜそれが起こっているのですか?

4

1 に答える 1