1

ローカル管理者アカウントを使用してサービス内から起動するアプリケーションがあります。このアプリケーションにはWebブラウザからアクセスでき、このインターフェイスを介してホストPCをシャットダウンできます。

ユーザーがホストPCにログインしていて、それを参照してシャットダウンすると、アプリケーションが終了し、期待どおりにPCをシャットダウンします-ExitWindowsEx()を使用します(シャットダウン特権が有効になっています)。

ただし、PCがログオフしている場合は、それを参照します。アプリケーションはサービス内で実行されたままで、ExitWindowsEx()を使用してシャットダウンを試みます。正常に戻り、問題はないように見えますが、PCはシャットダウンしません。

また、InitiateSystemShutdown()を試しましたが、これはめちゃくちゃ失敗してエラー2を返します。(システムは、指定されたファイルを見つけることができません)。

アプリケーションの起動にどのアカウントを使用するかは問題ではないようです。

どんな助けでも大歓迎です!

ありがとう。

4

4 に答える 4

1

悲しいことに、再現することはできません。メールスロットを公開する既存のサービスがあるので、次のコードを追加しました。

void RebootThisMachine ()
{
   if (GrabPrivilege (SE_SHUTDOWN_NAME))
   {
      if (!InitiateSystemShutdown (NULL,NULL,0,TRUE,TRUE))
      {
         wsprintf (g_szDebug, TEXT("RebootMachine - ISS failed, error %d"),
                   GetLastError()) ;
         DebugMessage (DEBUG_ERROR, g_szDebug) ;
      }
   }
   else
   {
      wsprintf (g_szDebug, TEXT("RebootMachine - cannot grab priv, error %d"),
                GetLastError()) ;
      DebugMessage (DEBUG_ERROR, g_szDebug) ;
   }
}

私が書いた小さなコマンドラインユーティリティからメールスロットメッセージを受け取ったときにそれを呼び出しました。InitiateSystemShutdownはサービスに適したAPIであり、これにより、ログインしているかどうかに関係なく、サービスを実行しているマシンが再起動します。私の(vista)マシンがログインしていない場合、シャットダウンにはしばらく時間がかかりますが、最終的には機能します(「シャットダウン」と言ってから30〜40秒後)。私のサービスはLocalSystemで実行されます。GrabPrivilegeは、以前に投稿したものと同じコードです。

だから、あなたはあなたがやろうとしていること可能であるという事実から心を奪うことができます。管理者アカウントを使用してサービスを実行しているようです。シャットダウンテストの目的でLocalSystemでサービスを実行しようとしましたか?おそらく、管理者の権限はLocalSystemの権限と完全には一致していません...

于 2009-05-15T16:28:41.120 に答える
0

http://www.google.ca/search?hl=en&q=exitwindowsex+serviceの場合、たとえば最初に見つけたのはhttp://www.eggheadcafe.com/software/aspnet/29901267/lockworkstation-and-です。 exitw.aspxは、サービスで「デスクトップとの対話」フラグ(非推奨)が有効になっている場合に問題があることを示します。

次に、 http://www.eggheadcafe.com/conversation.aspx?messageid = 29901274&threadid = 29901267など、上記のトピックに返信するさまざまなメッセージの修正を提案します。そのようなものが役立つ場合があります。

確かに応急修理ですが、提案された魔法の使用を回避する代替手段は、デスクトップと相互作用しない2番目のサービスを実行することです。2番目のサービスにExitWindowsExを呼び出して...そして任意のIPC(またはサービス)を使用します-特定のAPI)最初のサービスから(またはおそらくアプリケーションから)2番目のサービスをトリガーします。

于 2009-05-14T15:12:36.337 に答える
0

このコードを試して、その機能を教えてください。

GrabPrivilege (SE_SHUTDOWN_NAME);
ExitWindowsEx (EWX_REBOOT|EWX_FORCE, 0); // or whatever EWX flags you want

ヘルパー機能:

BOOL  GrabPrivilege (LPCTSTR lpctPrivName) 
{
   TOKEN_PRIVILEGES newtkp;
   HANDLE hToken;
   BOOL   bRetVal = FALSE;

   if (OpenProcessToken (GetCurrentProcess(), 
                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, 
                         &hToken)) 
   {
      LookupPrivilegeValue (NULL, 
                            lpctPrivName, 
                            &newtkp.Privileges[0].Luid); 
      newtkp.PrivilegeCount = 1;  // one privilege to set
      newtkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

      if (AdjustTokenPrivileges (hToken, 
                                 FALSE, 
                                 &newtkp, 
                                 0, 
                                 (PTOKEN_PRIVILEGES) NULL, 
                                 0))
      {
         DWORD dwRet = GetLastError();
         if (dwRet == ERROR_SUCCESS) bRetVal = TRUE;
      }
   }
   CloseHandle (hToken);
   return bRetVal;
}
于 2009-05-14T15:29:34.187 に答える
0

shutdown.exeツールを使用してみましたか?どのようなエラーが報告されますか?

Windows XP x64で同じ問題が発生しましたが、WMIを介してリモートで実行していましたが、シャットダウンツールで同じエラーが発生しました(21)。その情報で私はこの修正プログラムに出くわしました:

http://support.microsoft.com/kb/834100

現時点ではWindows2003Serverが手元にないため、テストできませんでしたが、役立つかもしれません。

于 2011-11-18T17:28:02.633 に答える