Windows Server 2003でローカルシステムとして実行されているWindowsサービスがあり、PsExecを使用して別のユーザーとしてコマンドを実行しようとしています(-u -p
パラメータ)ですが、Access is denied. PsExec could not start
エラー。
問題を再現するために、以下を実行できます。
C:\Documents and Settings\me>PsExec.exe -s cmd
PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.
C:\WINNT\system32>whoami
nt authority\system
C:\WINNT\system32>PsExec.exe -u DOMAIN\my-user -p mypass cmd
PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
Access is denied.
PsExec could not start cmd:
上記の例では、最初のPsExecコマンド(PsExec.exe -s cmd
)は、ローカルシステムとしてコマンドラインを提供します。次に、2番目のPsExecコマンド(PsExec.exe -u DOMAIN\my-user -p mypass cmd
)解決しようとしているエラーをスローします。
どんな助けでも大歓迎です!前もって感謝します!
PSEXEC.EXE
の最初のインスタンスをLocalSystemアカウントとして開始した後、次のように、ローカルコンピューターのIPアドレスをコマンドに含めて、2番目のPSEXECインスタンスを開始します。
PSEXEC.EXE \\LocalComputerIPAddress -u DOMAIN\my-user -p mypass CMD
発生している動作は、Windows Server 2003のService Pack 1によって追加された ループバックチェック機能 と呼ばれる新しいセキュリティ機能によるものです。リンクされたMSKB記事によると:
[Service Pack 1をインストール]した後、次の汎用名前付け規則(UNC)パスで完全修飾ドメイン名(FQDN)またはCNAMEエイリアスを使用してローカルでサーバーにアクセスしようとすると、認証の問題が発生します。
\\servername\sharename
このシナリオでは、次のいずれかの現象が発生します。
- 繰り返しログオンウィンドウが表示されます。
- 「アクセスが拒否されました」というエラーメッセージが表示されます。
- 「指定されたネットワークパスを受け入れたネットワークプロバイダーはありません」というエラーメッセージが表示されます。
- イベントID 537がセキュリティイベントログに記録されます。
この記事では、2つの解決策(上記の回避策に加えて)を提案しています。どちらの場合も、レジストリを編集して、1)NTLM認証要求で参照できるホスト名を追加するか、2)認証ループバックチェックを無効にします。サーバーをSP1以前の動作に戻します。
このWindowsITPro.comの記事によると PSEXECのしくみ :
PsExecは、リモートシステムで実行可能ファイルを開始し、実行可能ファイルのプロセスの入出力ストリームを制御して、ローカルシステムから実行可能ファイルと対話できるようにします。 PsExecは、実行可能イメージからPsexesvcという名前の埋め込まれたWindowsサービスを抽出し、それをリモートシステムのAdmin $共有にコピーすることでそうします。
つまり、ローカルマシンに対してPSEXECを実行しているにもかかわらず、それでもADMIN$
共有を使用しているため、上記のループバックチェック機能の動作が変更された理由です。