ウィンドウをシャットダウンするために次のことを行うレガシーコードを含むプログラムがあります。
ManagementClass mc = new ManagementClass( "Win32_OperatingSystem" );
mc.Get();
mc.Scope.Options.EnablePrivileges = true;
ManagementBaseObject mboShutdown = mc.GetMethodParameters( "Win32Shutdown" );
mboShutdown["Flags"] = "5"; // shutdown + force
mboShutdown["Reserved"] = "0";
foreach( ManagementObject mbo in mc.GetInstances() )
{
mbo.InvokeMethod( "Win32Shutdown", mboShutdown, null );
}
.NET 3.5 アプリケーションで、問題なく動作していました。最近、依存関係のアップグレードにより、ターゲット フレームワークを 4.0 クライアント プロファイルにバンプする必要がありました。今、コードが実行されるたびに、次の例外が発生します。
System.Management.ManagementException: "Privilege not held."
アプリケーションは Windows 7 の管理者アカウントで実行されており、このソフトウェアを更新する以外に何も変更されていません。
解決策を探しているときに見つけた唯一の情報は、.NET 1.1 に関する非常に古いバグ レポートと、回答されていない msdn の次のスレッドでした: http://social.msdn.microsoft.com/Forums/ vstudio/en-US/fa0bcae5-6f30-42b6-bb5f-b8a6edb88ac4/encountered-privillege-not-hold-exception-when-rebooting-the-server-in-net40-framewrk
この問題の原因を知っている人はいますか? WMI の使用をやめて、PInvoke InitiateSystemShutdownEx などだけにする必要がありますか?