私は現在、Windows用のサービスを作成しており、頻繁にそれを調整してテストコンピューターに更新しています。サービスを自動的に停止し、exeを更新し、サービスを再起動するスクリプトを作成したいと思います。しかし、それは私が問題を抱えている部分を停止して開始します。
接続しているコンピューターはドメイン上になく、ユーザー名とパスワードを共有していません。 sc.exe \\testsvr stop "myService"
を実行するのが最善の策だと思いますが、ドメインまたは共有のユーザー名とパスワードがないため、「アクセスが拒否されました」というメッセージが表示されます。
ユーザーを追加するだけで簡単にできますが、ユーザーを変更できない場合の学習体験としてこれが必要でした。
MicrosoftのSysinternals(Mark Russinovichによって作成された優れたツールセットの一部)の PsService を見てみましょう。
ウェブサイトから直接:
Usage: psservice [\\computer [-u username] [-p password]] <command> <options>
にとって <command>
、最も一般的なオプションとしてstart
、stop
、またはrestart
を使用できます。このスクリプトの優れている点は、2つのマシンが同じドメインのメンバーであるか、他の信頼を持っているかに依存しないことです。
ここで完全を期すために、ストックWindowsツールのみでこれを実行する場合は、最初にリモートマシンへのIPC接続を確立して(そのマシンでセキュリティトークンを確立するため))、次に「SC」コマンド:
Net Use \\remote\IPC$ /user:local-username-on-remote-machine passowrd
sc \\remote stop service-name
Net Use \\remote\IPC$ /delete
これにより、両方のマシンのワークグループ/ドメインメンバーシップの組み合わせに関係なく、リモートマシン上のサービスを制御できます。
ドメイン以外の構成で個人的に試したことはありませんが、「RunAs」を指定してSC.exeを実行し、ターゲットコンピューターの資格情報を使用しますか?
Runas /user:TargetComputerName\TargetAccountName "sc.exe \\testsvr stop ""myService"""
DOMAIN環境では、スクリプトを実行するログインユーザーに適切なユーザー権限が付与されていれば、NetUseコマンドを使用できます。 PowerShellはおそらく最も強力なオプションですが、古いMicrosoftオペレーティングシステムを実行している場合は、いくつかのPowerShellコマンドの実行で問題が発生する可能性があります。すべてがWindows2008以降の場合、私は間違いなくPowerShellを使用します。
それが選択肢ではない場合、私はPSToolsパッケージで大成功を収めました。 Evanが前述したように、このオプションを使用する場合は、同じパッケージのpskillユーティリティに精通している必要があります。一部のサービスは、リモートでいじくり回しているときに優雅に死ぬことはありません。この小さなユーティリティは、それらを殺すのに最適です。
好奇心から、これをどのスクリプト言語でコーディングしていますか? VBScript?バッチ? Perl?
Powershell2.0を見たいと思うかもしれません。この機能が一種のRDPとして組み込まれている可能性があるため、ドメインは必要ありませんが、接続を有効にしていくつかのポートを開きます。あなたがグーグルできる簡単な説明といくつかのキーワードについては ここ を見てください。