- PR -

ASPからサービスを停止させるには。

投稿者投稿内容
LUFT
会議室デビュー日: 2007/09/09
投稿数: 5
投稿日時: 2007-09-09 16:59
はじめまして。
Windows2003SP1+IIS6.0の環境でWebサーバーを運営していますが、Web経由で特定のサービス(ftpなど)を停止することはできるのでしょうか?
ASPからftpサービスを停止できるよう処理を作ろうとしているのですが、WSCRIPTSHELLやBASP21から外部コマンドの起動は出来るのに、その後のサービスを止める処理自体がどうにも動作しません。
NETSTOPするBATファイルや、StopServiceメソッドを発行するVBS、果てはSCコマンドに至るまで、いろいろ試しましたが、結果は同じです。
窓口となるASPファイルのあるフォルダは匿名アクセスを禁止して、ADMINISTRATORでログインしておりますので、権限的には問題ないと思います。
やり方をご存知の方がいらっしゃいましたら、お教えいただけないでしょうか?
それともWindowsでは、Web経由ではサービスを操作できない仕様になっているとか。。。
よろしくお願いします。
プレマニア
常連さん
会議室デビュー日: 2007/08/24
投稿数: 34
投稿日時: 2007-09-12 23:04
引用:

LUFTさんの書き込み (2007-09-09 16:59) より:
窓口となるASPファイルのあるフォルダは匿名アクセスを禁止して、ADMINISTRATORでログインしておりますので、権限的には問題ないと思います。

やり方をご存知の方がいらっしゃいましたら、お教えいただけないでしょうか?


はじめまして、プレマニアと申します。

正確にやり方を知っている訳ではないので、とりあえずキッカケの質問です。

Webアプリケーションを動かしているのもADMINISTRATORなのでしょうか。
LUFT
会議室デビュー日: 2007/09/09
投稿数: 5
投稿日時: 2007-09-13 10:03
返答ありがとうございます。
Webアプリケーションを動かしているのはというお問合せですが、すいませんが具体的にどの部分のことでしょうか?
ちなみに、IISAdminServiceやFTPPublishingServiceは、「ローカルシステムアカウント」がログオンしており、IISからそのASPファイル(のあるフォルダ)を実行するのは匿名アクセスを禁止している関係から、その都度Administratorでログオンするようにしています。
よろしくお願いします。
プレマニア
常連さん
会議室デビュー日: 2007/08/24
投稿数: 34
投稿日時: 2007-09-13 12:16
引用:

LUFTさんの書き込み (2007-09-13 10:03) より:
返答ありがとうございます。
Webアプリケーションを動かしているのはというお問合せですが、すいませんが具体的にどの部分のことでしょうか?
ちなみに、IISAdminServiceやFTPPublishingServiceは、「ローカルシステムアカウント」がログオンしており、IISからそのASPファイル(のあるフォルダ)を実行するのは匿名アクセスを禁止している関係から、その都度Administratorでログオンするようにしています。
よろしくお願いします。


具体的にはWebアプリケーションの設定で「アプリケーションプール」という項目があると
思いますが、そのアプリケーションプールの「セキュリティアカウント」を指します。

なぜこんな質問がキッカケになると考えたかというと、この「セキュリティアカウント」に
サービスを停止する権限がないのではないかと考えたからです。

「LocalSystem(ローカルシステムアカウント)」を指定していればまずこの可能性は
ない気がしますが、
「NETWORK_SERVICE(こちらが既定)」であれば権限が絡んでいるかも知れません。
LUFT
会議室デビュー日: 2007/09/09
投稿数: 5
投稿日時: 2007-09-13 23:05
ありがとうございます。>プレマニアさん
おっしゃるとおり、アプリケーションプールのセキュリティ設定を、NETWORK SERVICEからLOCAL SYSTEMに変えたところ、思惑通りサービスを停止できました。
ただし、DefaultAppPoolのセキュリティ設定を変えるのも気持ち悪いので、これ専用に別のPoolを作成して、そこに当該アプリ(仮想ディレクトリ)を割り当てて、そのPoolのセキュリティ設定をLOCAL SYSTEMに変えてみましたところ、サービスが落ちませんでした。
その後、もう一度DefaultAppPoolに戻してみましたが、今度はサービスが停止できなくなってしまいました。
サービスを停止できたのは1回限りで、その後成功していません。
時間の関係であまり試せてないのですが、もう少しいろいろ試してみます。
また何か進展がありましたら、ご報告します。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-09-14 00:19
Classic ASP なんですよね? ASP.NET ではなく。

なら、application pool の account は関係ないでしょう。
_________________
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2007-09-15 01:05
試したところできましたが。。
私の場合はJScriptですが、Server.CreateObjectでCOMを呼び出して、普通にFTPサービス停止できましたよ。
会社でやったのでどのCOMオブジェクト使ったのか忘れてしまい、ちょっと確かめる手段がありませんけれど。
WSCRIPTSHELLやBASP21じゃないのは確かですが、なんだったかな。。
サービスの停止や開始のメソッドがあったんでそのまま使ったんですが。

当然ながらクラシックASPはワーカープロセスではなくIISのアカウントで動作します。ファイルアクセス、DBアクセスなどもすべてこれです。
ワーカプロセスのアカウントは一切関係しません。
ISAPIフィルタなんかは逆にワーカプロセスのアカウントで動作しますけれど。(互換モードならASPと同じ)
匿名接続を無効化し、統合Windows認証などで実行した場合であればそのアカウントの権限で動作するので、LUFTさんの場合権限は問題ないことになるでしょうか。
この手の問題は権限が原因ってことが多いですけれども。

サービス名は短い方の名前(MSFtpsvとかだっけ)を使用する必要があると思いますが、そのあたりは大丈夫ですか?
LUFT
会議室デビュー日: 2007/09/09
投稿数: 5
投稿日時: 2007-09-19 23:39
返事が遅くなり大変申し訳ありません。
ようやく時間がとれて、リトライしてみましたので結果報告いたします。

みなさんご指摘のとおり、ASP.NETではなくCLASSIC ASPです。
ApplicationPoolの設定で一度はサービス停止できたのですが、それ以来再現できていなかったのですが、ご指摘に沿うとそもそもできないのが普通と受け取れますね。
それはさておき、ひでぽんさんのご意見を手がかりに、WMIで出来そうなことを突き止め、WMIでサービス停止するよう試したところ、今度はうまくいきました。

具体的には、下記のようなソースです。
strComputer = "."
strQuery = "Select * From Win32_Service Where Name = 'MSFTPSVC'"
Set objWMIService = GetObject("winmgmts:\\\\" & strComputer & "\\root\\cimv2")

Set colItems = objWMIService.Execquery(strQuery)
For Each objItem in colItems
strResult = objItem.StopService
Next

これをBASPもWSCRIPTSHELLも使わずに、ASPに記述しておくだけでした。
もちろん匿名アクセスを禁止して、Administratorでログインする必要はあります。
IUSR_**だとエラーになります(エラー内容は失念)。

今まではバッチファイルで、NET STOP MSFTPSVC をBASPからコールするやり方で挑んでいたのですが、さっぱりでした。

ひでぽんさんもWMIの方法でしょうか?

何はともあれ、みなさんのご協力のおかげで無事解決できました。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)