コマンドラインから rdp の有効性を確認します。 Windows Vista のリモート デスクトップ接続のマルチモニター機能

25.06.2018

を使用して何らかの操作を実行するというタスクが発生しました。 コマンドラインもちろん、別のコンピュータでは、ユーザーのところに行ってコマンド ラインを起動してコマンドを入力するのは私たちの方法ではありません。椅子から立ち上がらずにリモート コンピュータのコマンド ラインを起動し、コマンド ラインで必要なアクションを実行する必要があります。 。 もちろん、プログラムを使用して同様の操作を実行することもできます リモート接続、しかし、これは常に便利であるとは限らず、あなたとユーザーが同様のプログラムを持っている必要があります( クライアントサーバー)。 別のコンピュータのコマンドラインに接続する手順は、次のコマンドを使用して非常に簡単に実行できます。 PSEXEC.

PsExecは、リモート Windows システム上でコマンド ライン インターフェイスを対話的に呼び出し、さまざまなコマンドをリモートで実行できるコマンド ライン ユーティリティです。

このユーティリティは、管理者のコンピュータにのみインストールできます。 インストールするには、ダウンロードする必要があります。ここにリンクがあります マイクロソフト公式サイト 。 アーカイブをダウンロードした後、それを解凍し、解凍されたフォルダー内で PsExec.exe ファイルを見つける必要があります。 それを 2 回クリックすると、使用許諾契約が記載されたウィンドウが表示されます。「」をクリックします。 同意する".

コマンド構文を見てみましょう。

psexec [\\コンピュータ[,コンピュータ2[,...] | @file][-u ユーザー [-p パスワード]][-ns s][-l][-s|-e][-x][-i [セッション]][-c [-f|-v]] [-w ディレクトリ][-d][-<приоритет>][-a n,n,... ] プログラム [引数]

コンピューター指定されたコンピューター上でアプリケーションを実行するように PsExec に指示します。 コンピューター名が指定されていない場合、PsExec はアプリケーションを次の場所で起動します。 ローカルシステム、コンピューター名の代わりにアスタリスク文字 (\\*) が指定されている場合、PsExec プログラムは現在のドメインのすべてのコンピューターでアプリケーションを起動します。

@ファイル指定されたテキスト ファイルにリストされているすべてのコンピューターでアプリケーションを実行するように PsExec に指示します。

-aアプリケーションを実行できるプロセッサはカンマで区切られ、プロセッサには 1 から始まる番号が付けられます。たとえば、アプリケーションをプロセッサ 2 と 4 で実行するには、「-a 2,4」と入力します。

-c指定したプログラムがコピーされます リモートシステム実行のために。 このパラメータが指定されていない場合、アプリケーションはリモート システムのシステム フォルダに配置されている必要があります。

-dアプリケーションが完了するまで待つ必要がないことを示します。 このオプションは、非対話型アプリケーションを実行する場合にのみ使用してください。

-e指定されたアカウント プロファイルがロードされていません。

-f指定されたプログラムは、そのようなファイルがリモート システムにすでに存在している場合でも、リモート システムにコピーされます。

-私起動されたプログラムは、リモート システム上の指定されたセッションのデスクトップにアクセスします。 セッションが指定されていない場合、プロセスはコンソール セッションで実行されます。

-lプロセスが開始されると、ユーザーには制限付きの権限が付与されます (管理者グループの権限は上書きされ、ユーザーにはユーザー グループに割り当てられた権限のみが付与されます)。 OS内 Windows Vistaこのプロセスは、低いレベルの信頼性から始まります。

-nリモート コンピューターへの接続遅延を (秒単位で) 設定できます。

-pユーザー名にオプションのパスワードを指定できます。 このパラメータを省略すると、パスワードの入力を求められ、パスワードは画面に表示されません。

-sリモート プロセスはシステム アカウントから起動されます。

-uリモート システムにログインするためのオプションのユーザー名を指定できます。

-v指定されたファイルは、バージョン番号が高いか新しい場合にのみ、既存のファイルの代わりにリモート システムにコピーされます。

-wプロセスの作業ディレクトリ (リモート システム内のパス) を指定できます。

-x Winlogon デスクトップにユーザー インターフェイスを表示します (ローカル システムのみ)。

-優先度(優先度) プロセスにさまざまな優先度を設定できます: -low (低)、-belownormal (平均以下)、-abovenormal (平均以上)、-high (高)、または -realtime (リアルタイム)。

プログラム起動するプログラムの名前。

引数渡される引数 (ファイル パスはターゲット システム上のローカル パスとして指定する必要があることに注意してください)。

チームワークの例 PSEXEC:

1) 別のコンピュータのコマンドラインを起動するには、次のように入力する必要があります。
psexec\\<имя компьюетра>cmd

例えば:
psexec\\WIN782 cmd



その後、必要なコマンドを入力できます。

2) 任意のプログラムを実行するため ( この例では test.exe) をリモート コンピューター上で実行するには、コマンドを実行する必要があります (このコマンドは test.exe プログラムをリモート システムにコピーし、対話的に実行します)。

psexec\\<имя компьютера>-c テスト.exe

例えば:
psexec\\WIN782-c テスト.exe

3) このようなプログラムがリモート システムにすでにインストールされており、システム ディレクトリにない場合は、このプログラムへのフル パスを指定します。

psexec\\WIN782 c:\temp\test.exe

システム管理者の間で最も人気のあるタスクの 1 つは、席を離れることなくリモート コンピュータ上でコマンドを実行することです。 これは、プログラムやユーティリティのインストール、設定の変更、またはその他の目的で必要になる場合があります。 そしてもちろん、1 台のコンピューターについて話すことはほとんどなく、多くの場合、コマンドは多数のワークステーションまたはサーバーで実行する必要があります。

この問題はよく知られているため、解決する方法はたくさんあります。 グループ ポリシー (この目的でログイン スクリプトや起動スクリプトを使用できます) から始まり、System Center Essentials や System Center などの強力な管理システムまで 構成マネージャー。 ただし、この記事では、コマンド ラインまたはスクリプト ファイルからすぐに使用でき、また、必要のない方法を検討したいと思います。 プレインストールエージェントやその他の混乱。 ただし、もちろんいくつかの事前要件があります。 たとえば、コマンドを実行するコンピューターに対する管理者権限が必要です (「プロキシ」シナリオを除く。これについては後で説明します)。

PSExec.exe

この問題を解決するための私のお気に入りの方法の 1 つは、Mark Russinovich によって作成された PsExec.exe コマンド ライン ユーティリティです。これは Windows SysInternals Web サイトから自由にダウンロードできます。 記事の最後にリンクがあります。 システムにインストールする必要はなく、%path% 環境変数に含まれるフォルダーの 1 つにコピーし、任意のコマンド ライン シェル (Cmd または PowerShell) から呼び出すことができます。

PsExec の使用は非常に簡単です。 たとえば、メイン コンピューターで ipconfig /flushdns を実行するには、次のコマンドを実行するだけです。

psexec\\main ipconfig /flushdns

ipconfig コマンドは、資格情報を使用してメイン コンピューターで実行されます。 ipconfig が完了すると、すべてのテキスト出力がコンピュータに送信され、エラー コードも返されます。 コマンドが正常に実行された場合、値は 0 になります。


もちろん、PsExec の機能はこれで終わりではありません。 パラメーターを指定せずにユーティリティを呼び出すと、他の内容を表示できます。 利用可能なオプション。 そのうちのいくつかだけに注目してみます。

-dコマンドが実行されるのを待つ必要はなく、コマンドを実行して忘れることを PsExec に伝えます。 この場合、コンソール ユーティリティから出力を受け取ることはできませんが、完了を待たずに出力を受け取ることができます。 前のコマンド他の人を起動します。 これは、たとえば、複数のコンピュータでプログラム インストーラを実行する必要がある場合に非常に便利です。

デフォルトでは、PsExec は次の場所でコマンドを実行します。 隠しモードつまり、コマンドが実行されるシステムでは、ウィンドウやダイアログは表示されません。 ただし、キーを使用してこの動作を変更することができます。 -私。 その後、ウィンドウを表示するセッション番号を指定できます。指定できない場合は、インターフェイスはコンソール セッションで表示されます。

したがって、バージョン情報を含むウィンドウを表示するには オペレーティング·システムメイン コンピューターでは、次のように PsExec を実行する必要があります。

psexec -i \\main winver.exe

複数のコンピュータでコマンドを一度に実行したい場合は、リスト テキスト ファイルからコンピュータの名前を読み取ることができると便利です。

psexec @c:\comps.txt systeminfo.exe

PsExec の最も便利な機能の 1 つは、コンピュータ間で入出力を対話的にリダイレクトする機能です。これにより、たとえば cmd.exe をコンピュータ上で実行できるようになります。 リモートサーバー、コマンドを与えて結果を取得します ローカルコンピュータ.


PsExec はどのように機能しますか?

独創的なものはすべてシンプルです。 実行可能ファイル PsExec.exe のリソースには、別の実行可能ファイル PSEXESVC があります。 Windowsサービス。 コマンドを実行する前に、PsExec はこのリソースを非表示の管理ファイルに解凍します。 共有フォルダリモート コンピューターのファイル: \\ComputerName\Admin$\system32\psexesvc.exe。 -c スイッチを使用してコピーする必要があることを示した場合 実行可能ファイルこのシステムでは、これらもこのフォルダーにコピーされます。

準備手順が完了すると、PsExec は API を使用してサービスをインストールし、開始します。 Windowsの機能サービスを管理するため。 PSEXESVC が開始されると、データ (入力コマンド、結果など) を転送するために、PSEXESVC と PsExec の間にいくつかのチャネルが作成されます。 完了すると、PsExec はサービスを停止し、ターゲット コンピューターから削除します。

Windows Management Instrumentation (WMI)

この人気のタスクを実装する次の方法について説明します。 Windowsを使用する管理機器。 WMI はすべてのオペレーティング システムに存在します マイクロソフトのシステム、Windows 2000 以降、Windows 9x でも別のパッケージからインストールできます。 WMI はデフォルトで有効になっており、必要ありません。 追加設定。 それを使うには十分です 管理者権限、およびファイアウォールで許可されている DCOM プロトコル。 WMI はシステムを管理するための膨大な機能を提供しますが、ここではそのうちの 1 つだけに注目します。

プロセスを開始するには、Win32_Process クラスの Create メソッドが必要です。 使い方はとても簡単です。 PowerShell では、これは次のように行われます。

$Computer = "メイン"
$Command = "cmd.exe /c systeminfo.exe >
("\\$Computer\root\cimv2:Win32_Process").create($Command)

ここでは、起動するプロセスとして cmd.exe を指定し、必要なコマンドを引数として渡しました。 これは、リモート コンピューターの環境変数または組み込みの cmd.exe ステートメントを使用する必要がある場合に必要です。 > " 出力をファイルにリダイレクトします。 Create メソッドはプロセスの完了を待たず、結果を返しませんが、その識別子 (ProcessID) を示します。

PowerShell がまだインストールされていないコンピューターを使用している場合は、VBScript スクリプトからこの WMI メソッドを呼び出すこともできます。 たとえば次のようになります。

リスト 1 – WMI (VBScript) を使用したプロセスの開始

コンピュータ = 「PC3」
コマンド = "cmd.exe /c systeminfo.exe > \\server\share\%computername%.txt"
Set objWMIService = GetObject("winmgmts:\\" & Computer & "\root\cimv2:Win32_Process")
結果 = objWMIService.Create("calc.exe", Null, Null, intProcessID)

ただし、コマンド ライン ユーティリティ wmic.exe を使用する方がはるかに簡単です。これは、WMI を操作するための非常に便利なインターフェイスを提供し、Windows XP 以降のオペレーティング システムに含まれています。 この中で、たとえばメイン コンピューターで電卓を起動するには、次のコマンドを実行するだけです。

wmic /node:main process call create calc.exe

もちろん、WMI の機能はプロセスの起動だけに限定されません。 このテクノロジについてさらに詳しく知りたい場合は、WMI に関する Konstantin Leontiev の記事を読むことをお勧めします。この記事へのリンクは記事の最後にあります。

WSH リモート スクリプト

はい、奇妙なことに、Windows Script Host には他のコンピュータでスクリプトを実行する機能もあります。 確かに、この機能はあまり人気がありません。これはおそらく、必要な準備措置が多すぎて、その代わりに機会がほとんどないという事実が原因と考えられます。 しかし、役に立つかもしれないので、この方法については引き続き説明します。

したがって、WSH を使用して別のコンピューターでスクリプトを実行するには、次の操作を行う必要があります。

    リモート コンピューターの管理者権限。 これは言うまでもなく、この記事に記載されている他のほぼすべての起動方法で必要です。

    で作成して WSH リモート スクリプトを許可します システムレジストリ文字列パラメータ Remote レジストリ キー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings の「1」に等しい

    Microsoft サポート技術情報の記事番号 311269 に記載されているバグのため、Windows XP システムではコマンド wscript –regserver を実行する必要がある場合があります。

    コンピュータがファイアウォールを使用している場合は、DCOM アクセスを許可する必要があります。 さらに、これは管理対象コンピュータだけでなく、スクリプトを実行するコンピュータでも実行する必要があります。

    Service Pack 2 以降を適用した Windows XP システムでは、DCOM セキュリティ設定を変更する必要があります。 これは次を使用して実行できます グループポリシー。 [コンピューターの構成]\[Windows の設定]\[セキュリティの設定]\[ローカル ポリシー]\[セキュリティ オプション] ノードで、アクセス許可を次のように設定する必要があります。

    1. DCOM: セキュリティ記述子定義言語 (SDDL) 構文におけるマシン アクセス制限
      「匿名ログオン」グループと「全員」グループに「ローカルを許可」および「リモート アクセスを許可」のアクセス許可を付与します。

      DCOM: セキュリティ記述子定義言語 (SDDL) 構文におけるマシン起動の制限
      管理者グループに権限を付与します。 ローカル起動を許可、リモート起動を許可、ローカル アクティベーションを許可、リモート アクティベーションを許可
      Everyone グループ – ローカル起動を許可、ローカルアクティベーションを許可

さて、これらの手順をすべて行った後、別のコンピュータでスクリプトを実行してみることができます。

このテクノロジーを使用するスクリプトの例:

リスト #2 – WSH リモート スクリプト (VBScript)

objController = CreateObject("WshController") を設定します
Set objRemoteScript = objController.CreateScript("C:\test.vbs", "PC5")WScript.ConnectObject objRemoteScript、「remote_」
objRemoteScript.Execute
Do While objRemoteScript.Status<> 1
WScript.Sleep 1000
ループ
MsgBox "スクリプトが完了しました"
サブリモート_エラー
Dim objError
objError = objRemoteScript.Error を設定します
WScript.Echo "エラー – 行: " & objError.Line & _
", Char: " & objError.Character & vbCrLf & _
"説明: " & objError.Description
WScript.終了 –1
エンドサブ

2 行目では、リモート コンピューター上で実行されるスクリプト ファイルへのパスと、このコンピューターの実際の名前が、CreateScript 関数のパラメーターとして指定されます。

このテクノロジーに関する詳細な記事は、記事で読むことができます。 高度な VBScript 用 マイクロソフト Windows管理者 – 第 6 章: リモート スクリプト(リンクを参照)。

タスクスケジューラ

タスク スケジューラは、at.exe と schtasks.exe という 2 つのユーティリティを使用してコマンド ラインから制御できます。 これらのユーティリティは両方とも、リモート コンピュータの名前を指定してタスクを作成できるため、問題を解決できます。 ただし、schtasks.exe にはさらに多くの機能があるため、ここでは schtasks.exe についてのみ詳しく説明します。

他のコンピューターでコマンドを実行することはスケジューラーの主な目的ではありませんが、それにもかかわらず、多くの興味深いシナリオを実装することができます。 たとえば、これを使用してインストールを有効にすることができます。 ソフトウェア昼休み中。 または、ユーザーが異なる時間に昼食をとる場合は、コンピュータが一定時間非アクティブになった後に起動を実行できます。

schtasks /create /s server6.td.local /tn install /tr \\main\data\install.cmd /sc Once /st 13:00 /ru system

どのアカウントでタスクが実行されるかを理解することが重要です。 この例では、システムに /ru パラメーターを指定したため、コンピューター アカウントのセットアップを完了するには、への読み取りアクセスが必要です。 ネットワークフォルダー番組配信に伴い。

もう 1 つの有効な解決策は、毎日実行するアクションをスケジュールし、成功が確認された場合にのみタスクを削除することだと思われます。 つまり、最初にプログラム インストーラーを起動し、完了するのを待って、プログラムが正常にインストールされたかどうかを確認する単純なバッチ ファイルを作成できます。 存在する場合、そのコンピュータのスケジューラからジョブが削除されます。 そのようなファイルの例:

リスト 3 – プログラムのインストールとタスクの削除 (Windows バッチ)

msiexec /qn /package \\server\share\subinacl.msi
存在する場合 "c:\program files\Windows Resource Kits\Tools\subinacl.exe" (
subinacl /tn Install_Subinacl /f

WinRM (WS 管理)

WinRM は、Web サービスを使用してシステムを管理できるようにする Microsoft のオープン スタンダード DMTF (Distributed Management Task Force) の実装です。 このテクノロジーの構造についてはこれ以上深くは説明しませんが、それを使用するために必要なことについて簡単に説明します。

WinRM バージョン 1 以降は、Windows Vista および Windows Server 2008 以降のオペレーティング システムに含まれています。Windows XP および Windows Server 2003 の場合は、WinRM を別のパッケージとしてインストールできます (リンクを参照)。

標準ポートを使用してコンピュータに接続し、管理アカウントへの接続を許可するようにコンピュータをすばやく設定するには、次のコマンドを実行するだけです。

winrmクイック構成

winrm が確認を求めないようにするには、呼び出しに -quiet スイッチを追加します。 さらに詳しい情報を調べる 微調整 winrm の組み込みヘルプを参照できます。

winrm ヘルプ構成

Web サーバーが管理対象コンピューター上で実行されている場合、WinRM はデフォルトで標準の HTTP ポートを使用しますが、いかなる形でも Web サーバーに干渉しません。 特にそれ専用の接続のみをインターセプトします。

もちろん、管理するすべてのコンピューターでこのコマンドを手動で実行する必要はありません。 必要な設定はすべてグループ ポリシーを使用して簡単に行うことができます。 これを行うには、次のものが必要です。

  1. WinRM (Windows リモート管理) サービスを自動的に開始するように構成する
  2. グループ ポリシー項目 [コンピューターの構成\管理用テンプレート\Windows コンポーネント\Windows リモート管理 (WinRM)\WinRM サービス\リスナーの自動構成を許可する] を構成します。 ここでは、接続を許可する IP アドレスの範囲を指定する必要があります。
  3. もちろん、適切なポート (デフォルトでは 80) への接続を許可する必要もあります。 Windows ファイアウォール.

HTTP (80) ポートが使用されるか HTTPS (443) ポートが使用されるかに関係なく、WinRM によって送信されるトラフィックは暗号化されます (もちろん、このオプションを無効にしない限り)。 デフォルトの認証プロトコルは Kerberos です。

設定については十分なので、直接使用してみましょう。 winrm ユーティリティを使用すると、WinRM サービスを構成したり、WMI クエリなどを実行したりできますが、私たちは別のユーティリティである winrs にもっと興味があります。 ここでの RS という文字はリモート シェルを表します。 WinRS は WinRM テクノロジを使用していますが、PsExec と非常によく似ています。 コンピューター名は -r スイッチで指定され、その後に実行するコマンドが続きます。 以下にいくつかの例を示します。

winrs -r:コアver.exe

winrs はすでに cmd.exe をリモート シェルとして使用しているため、コマンドでリモート環境変数に簡単にアクセスしたり、他の cmd.exe 組み込みコマンドを使用したりできます。

winrs -r:Core "ディレクトリ c:\temp > c:\temp\list.txt"

PsExec と同様に、winrs ユーティリティを使用すると、リモート コンピューター上で対話型セッションを開くことができます。

winrs -r:main cmd.exe

この機能は Telnet セッションに似ていますが、セキュリティの観点からは、winrs を使用する方が Telnet や PsExec よりも確実に優れています。 ポートが HTTP (80) であるか HTTPS (443) であるかに関係なく、WinRM によって送信されるトラフィックは暗号化されます (もちろん、このオプションを無効にしない限り)。 デフォルトの認証プロトコルは Kerberos です。

Windows PowerShell 2.0 リモート処理

2番目ですが、 Windows版 PowerShell は、この記事の執筆時点ではまだベータ テスト段階にあり、現場での機能については リモート実行チームは間違いなく今伝える価値がある。 プレビュー バージョン (リンクを参照) をダウンロードするか、Windows 7 または Windows Server 2008 R2 のベータ版の一部として、自分で試すことができます。

PowerShell Remoting インフラストラクチャは WinRM バージョン 2.0 に基づいているため、送信データの暗号化や作業機能など、このテクノロジの利点をすべて継承しています。 標準ポート HTTP/HTTPS。 しかし、言語の豊富な機能のおかげで、 Windows PowerShell、そしてオブジェクトを扱う彼の能力により、私たちはさらに大きなチャンスを得ることができます。 現時点では、WinRM2.0 パッケージもベータ テスト中であり、Windows Vista および Windows 2008 システムに対してのみダウンロードできます。 Windows システム 7 および Windows Server 2008R2 では、PowerShell 2.0 と同様にネイティブに組み込まれます。

更新: この記事がサイトに公開されるまでに、PowerShell 2.0 と WinRM 2.0 の最終バージョンは、サポートされているすべてのプラットフォームですでに利用可能になっています。 Windows Server 2008R2 および Windows 7 では、これらはシステムの統合コンポーネントとしてすでに組み込まれており、Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008 の場合、必要なすべてのコンポーネントは Windows Management と呼ばれるパッケージの形式で入手できます。フレームワーク。

これらすべての利点を活用するには、マネージャーと管理対象コンピューターの両方で PowerShell リモート処理を有効にする必要があります。 これは、コマンドレット ( Windowsコマンド PowerShell)-PSRemoting を有効にします。 また、-Force キーを追加すると、確認は要求されません。 このコマンドレットは、必要に応じて winrs Quickconfig を呼び出し、Windows ファイアウォールに例外を作成するため、追加の手順を実行する必要はありません。

この後、Invoke-Command コマンドレット (またはそのエイリアス icm) を使用して、他のコンピューターでコマンドを簡単に実行できます。

Invoke-Command -ComputerName Main -ScriptBlock (netsh インターフェイス ダンプ > c:\ipconfig.txt)

もちろん、コマンドを事前に変数に入れることもできます。また、-ComputerName パラメーターには、1 台ではなく複数のコンピューターの名前を一度に指定できます。 次のシーケンスにより、3 台のコンピュータの Explorer.exe ファイルのバージョンを一度に表示できます。

$Command = ((get-item c:\Windows\explorer.exe).VersionInfo.FileVersion)
Invoke-Command -ComputerName Main、Server7、Replica -ScriptBlock $Command


ご覧のとおり、1 つのブロックで複数のコマンドを一度に渡し、複数のコンピューターでの実行結果を変数に入れて、それらのコマンドを複数のコンピューターで処理できます。 ワークステーションを使用して Windowsの機能オブジェクトを操作するための PowerShell。

ただし、PowerShell Remoting の機能はまだ始まったばかりです。 Enter-PSSession コマンドレットを使用して、リモート コンピューター上の対話型 Windows PowerShell セッションにログインできます。 このようなセッションは、Exit-PSSession コマンドレットを使用して終了するか、単に終了することができます。

New-PSSession コマンドレットは、次の場所にセッションを作成します。 リモートコンピュータ、ポインターを変数に配置し、引数として Invoke-Command に渡すことで、永続的な環境で複数のコンピューター上でコマンドを同時に実行できます。 スクリーンショットの例では、リスト c:\computers.txt から複数のコンピューターで一連のコマンドを一度に実行しています。


プロキシ中

この方法は上記のすべての方法とは異なり、まったく異なるタスクを実行しますが、関連性は劣りません。 権限の委任が不可能な場合、または提供される権限が多すぎる場合、標準ユーザーは、追加の権限を付与したり、管理者のパスワードを侵害したりすることなく、管理者特権を必要とするコマンドを実行できます。

ほとんどの場合、このような問題は、cpau.exe (リンクを参照) などのユーティリティを使用して解決します。このユーティリティは、特定のプログラムの実行を許可する管理者アカウントの暗号化されたパスワードを含むファイルを作成します。 ただし、問題は、パスワードが暗号化されていても、ユーティリティはプログラムを実行する前にパスワードを復号化する必要があることです。 したがって、ユーザーはパスワード解読アルゴリズムを繰り返し実行してそれを見つけるユーティリティを使用でき、これを使用して他のプログラムを起動したり、追加の権限を取得したりできます。 もちろん、実際にはこれは非常に困難です 一般ユーザー特別な知識を持たない人でも、それは十分に可能です。 もう一度明確にしておきますが、これは特定のユーティリティの問題ではなく、このアプローチ全体の問題です。

runas ユーティリティの /savecred パラメータが問題の解決に適していると思われる場合もあります。 しかし、ここにはさらに 2 つの問題があります。 まず、上記の場合と同様に、パスワードはユーザーのコンピュータに保存されるため、復号化できますが、runas の場合は権限が必要です。 ローカル管理者。 次に、runas は資格情報を特定のコマンドに関連付けずに保存するため、ユーザーはアクセス権を付与したいコマンドだけでなく、その他のコマンドも高い権限で実行できるようになります。

これらの問題を回避しながら特定のコマンドの実行を許可するには、「プロキシ」と呼ばれる手法を使用できます。

以下のように動作します。 高い権限を持つスクリプトがコンピューター上で常に実行されています。 たとえば、この例では、管理者権限を持つアカウントから起動します。 ファイルサーバー。 ユーザーの信号により、あらかじめ決められた 1 つのコマンドが実行されます。 この例では、ネットワーク上で開いているすべてのファイルを閉じます。

このシステムを整理するには、サーバー上の c:\scripts\ フォルダーなどに配置します。 バッチファイル Server.cmd と Action.cmd 。

リスト 4 – Server.cmd (Windows バッチ)

set トリガー=c:\commandShare\trigger.txt
set action=c:\scripts\action.cmd
set log=c:\scripts\log.txt
:始める
存在する場合 %trigger% start %action% & echo %time% %date%>>%log% & del %trigger%
スリープ.exe 5
スタートに移動

リスト 5 – Action.cmd (Windows バッチ)

for /f "skip=4 tokens=1" %%a in (‘net files’) do net files %%a /close
出口

Server.cmd は、ユーザーからのサイン (特定の場所にファイルを作成する) を待ち、それを受け取ると、コマンド - Action.cmd を使用してファイルを起動します。 もちろん、ユーザーはこのフォルダーにアクセスできません。 自動起動 Server.cmd は、スケジューラで適切なタスクを作成するだけで、コンピュータの起動時に整理できます。

schtasks /create /ru ドメイン\管理者 /rp /sc onstart /tn ProxyScript /tr c:\scripts\server.cmd

/ru パラメータの後にそれが示されます アカウント/rp パラメータの後にパスワードが指定されていないため、スクリプトが実行されます (この場合、サーバー上で管理者権限があります)。パスワードはタスクの作成時に要求されます。 /sc パラメーターを使用すると、スクリプトが起動される瞬間 (この場合はコンピューターの電源が入ったとき) を指定できます。 /tn と /tr を使用すると、タスクの名前と実行可能ファイルを指定できます。

ここで、ユーザーがスクリプトに通知できるように、フォルダー c:\commandShare を作成し、ネットワーク経由でアクセスできるようにします。 コマンドを実行するユーザーのみが、このフォルダーへの書き込みアクセス権を持つ必要があります。

この後、ユーザーは Run.cmd ファイルをデスクトップに配置するだけで十分です。

リスト 6 – Run.cmd (Windows バッチ)

エコー テスト > \\server\commandShare\trigger.txt

ユーザーに代わって実行すると、ファイル \\server\commandShare\trigger.txt が作成されます。 これに気付いた Server.cmd スクリプトは、その権限で Action.cmd ファイルを起動し、現在時刻に関するエントリを c:\scripts\log.txt ファイルに追加してから、trigger.txt を削除します。次のユーザー信号が届くまで、コマンドを再度実行します。

Server.cmd スクリプトは Sleep.exe ユーティリティを使用します。これにより、秒単位で指定された期間、スクリプトの実行を一時停止できます。 これはオペレーティング システムには含まれていませんが、リソース キット ツール (リンクを参照) から取得して任意のコンピューターにコピーすることができます。

Windows の以前のサーバー バージョンでは、 リモコンサーバー管理者はターミナル サービスを使用する必要がありました。 マイナス そのような決断管理者が日常的な管理タスクを実行するためにリモート接続を 1 つだけ必要とする場合でも、ターミナル サービスを展開する必要がありました。 Windows XP および Windows Server 2003 には、標準の管理用リモート デスクトップ メカニズム (または単にリモート デスクトップ) があり、これを使用してリモートに接続し、必要なサーバー管理操作を実行できます。 このメカニズムはターミナル サービスに基づいており、2 つの同時リモート接続 (Windows XP では 1 つ) をサポートします。 管理者は、任意のワークステーションから制御下にあるすべてのサーバーを管理できます。 Windowsコントロール Server 2003、リモートで接続。

注記
管理用リモート デスクトップ メカニズムは、Windows 2000 ターミナル サービスでサポートされていたリモート管理モードと基本的に似ており、リモート管理タスクはターミナル サービスから分離され、別のメカニズム内に実装されます。 リモート管理メカニズムをターミナル サービスから分離することで、別のコンピュータからサーバーを管理するだけで済む状況において、サーバーの負荷を最小限に抑えることができました。

Windows XP および Windows Server 2003 には、ユーザーが自分のコンピュータへのアクセスを開始し、困難な状況で助けを得ることができるリモート アシスタンス機能もあります (次のセクションを参照)。

注記
デフォルトでは、リモート デスクトップとリモート アシスタンスは無効になっています。

さらに、Windows XP または Windows Server 2003 を実行しているコンピュータにインターネット インフォメーション サービス (IIS) の一部として Web サーバーがインストールされている場合は、このコンピュータを介して、そのコンピュータ上にある Windows XP または Windows Server 2003 システムにリモート アクセスできます。同じ ローカルネットワーク、Web ブラウザから ( インターネットエクスプローラー 4.0 以降)、任意のオペレーティング システムで実行できます。 この機能を使用すると、たとえば、Windows 95 を実行している低電力コンピュータでブラウザを起動し、強力なプロセッサを搭載したリモート Windows Server 2003 システムの名前を入力して、そのシステムで作業することができます。 全画面モード.
すべてのリモート アクセス セッションは、データやシステムへの不正アクセスを防ぐために暗号化されます。 RDPプロトコルこの場合に使用される は、RC4 アルゴリズムを使用して暗号化されます。

リモートアクセスを許可する

リモート アクセス モードを制御するには (ダイヤルアップ接続によるリモート アクセスと混同しないでください)、[リモート] タブ ( リモート使用) プロパティウィンドウ システムプロパティ (図 10.9)。 (このウィンドウにすばやくアクセスするには、キーを使用します。 +.)
ユーザーが他のコンピュータからこのコンピュータにリモート接続できるようにするには、[ユーザーにこのコンピュータへのリモート接続を許可する] チェックボックスをオンにします。 [リモート ユーザーの選択] ボタンをクリックすると、リモート アクセスを許可するユーザーを明示的に指定できます (図 10.10)。これらのユーザーはローカルのリモート デスクトップ ユーザー グループに含まれます。 デフォルトでは、管理者のみがコンピューターにリモート アクセスできます。
リモート アクセスにはパスワードがないとアカウントを使用できません。 コンピュータ上にそのようなレコードがある場合、[ユーザーにこのコンピュータへのリモート接続を許可する] チェックボックスをオンにすると、図に示す警告が表示されます。 10.11。

米。 10.9。 リモート デスクトップおよびリモート アシスタンス機能を管理するためのウィンドウ

米。 10.10。 このウィンドウで指定されたユーザーは、コンピュータのデスクトップへのリモート アクセスを許可されます。


米。 10.11。 パスワードのないアカウントを使用してコンピュータにリモート アクセスすることはできないという注意事項

リモート アクセス セッションを初期化するには、リモート デスクトップ接続ユーティリティを使用します ([スタート] | [すべてのプログラム] | [アクセサリ] | [通信] サブメニューから起動するか、コマンド ラインから mstsc コマンドを使用して起動できます)。 リモート コンピュータの名前または IP アドレスを入力し、[接続] ボタン (図 10.12) をクリックします。しばらくすると、リモート システムへの登録を促すウィンドウが表示されます。

注意

米。 10.11。 パスワードのないアカウントを使用してコンピュータにリモート アクセスすることはできないという注意事項

リモート アクセス セッションの開始と構成

リモート アクセス セッションを初期化するには、リモート デスクトップ接続ユーティリティを使用します ([スタート] | [すべてのプログラム] | [アクセサリ] | [通信] サブメニューから起動するか、コマンド ラインから mstsc コマンドを使用して起動できます)。 リモート コンピュータの名前または IP アドレスを入力し、[接続] ボタン (図 10.12) をクリックします。しばらくすると、リモート システムへの登録を促すウィンドウが表示されます。



米。 10.12。 このウィンドウから、リモート コンピュータとのセッションを開始できます。

注意

Windows XP システムでは、リモート デスクトップを使用してログオンすると、現在のユーザーがシステムから「追い出されて」、 現在のセッション閉まらない。 リモート ユーザーがすでに登録されているユーザーの名前でログインすると、作業環境が得られます。 窓を開ける, 実行中のプログラム- このユーザーは、再びログインして「エイリアン」を追い出すことができます。 ときのみ リモートを使用するお手伝いが可能です 同時操作 1 つのセッションに 2 人のユーザーが参加します。 Windows Server 2003 ではリモート管理に 2 つのセッションが許可されているため、このようなことは起こりません。 ただし、mstsc /console コマンドを使用すると、Windows XP と同じ操作モード、つまり「プッシュ」を使用できます。
[リモート デスクトップ接続] ウィンドウで、[オプション] ボタンをクリックし、リモート接続パラメータが定義されているすべてのタブを注意深く確認します。 たとえば、画面サイズ、色深度 (最大 24 ビット)、接続速度などを設定できます。[ローカル リソース] タブに注目してください (図 10.13)。

米。 10.13。 ローカルデバイスの再割り当てを制御するタブ

デフォルトでは、リモート コンピュータからの音声はローカル コンピュータにリダイレクトされ、リモート コンピュータでの作業中にローカル プリンタに印刷できます。 [ディスク ドライブ] チェックボックスをオンにすると、両方のシステムのディスクを同時に使用できます。 これは、たとえば、ウィンドウ内で「手を少し動かすだけで」ファイルをコピーする場合に非常に便利です。 Windows プログラムエクスプローラー (両方のコンピューターのディスクが表示されます) を使用すると、リモート コンピューターからローカル ディスクに情報をコピーできます。
[エクスペリエンス] タブ (図 10.14) を使用すると、リモート アクセス セッションを接続パラメータに適応させることができます。低速チャネルでは一部のグラフィック機能を無効にし、ローカル ネットワーク経由で接続する場合はすべての機能を有効にすることができます。

米。 10.14。 通信チャネルの速度に応じたリモート アクセス パラメータの構成

セッション ウィンドウを全画面モードから固定サイズ画面に、またはその逆に切り替えるには、キーを使用します。 ++

Windows Server 2003 システムは、リモート デスクトップ スナップインを使用してターミナル サービスと連携します。 コンピュータへのリモートアクセスにも使用できます。 図では、 例として、図 10.15 は 2 台のリモート コンピューター (リモート サーバーとドメイン コントローラー) への同時接続を示しています。 各セッションは事前に作成および構成されており (スナップイン ルートおよびリモート アクセス セッション ツリーを参照)、リスト内でカーソルをポイントすることで簡単に開始できます。 異なるセッション間で簡単に切り替えることもできます。


米。 10.15。 2 つの同時リモート アクセス セッションを備えたリモート デスクトップ スナップイン ウィンドウ

セッションからのログアウト

リモート コンピュータ セッションで作業している場合、管理者にはセッションを終了するための 3 つのオプションがあります (いずれの場合も、[スタート] メニューを開いて [シャットダウン] ボタンをクリックする必要があります)。

  • [Windows のシャットダウン] ウィンドウで [シャットダウン] オプションを選択すると、コンピュータの電源をオフにできます。
  • 「ログオフ」オプションを選択すると、システムからログアウトできます。
  • [切断] オプションを選択すると、現在のセッションを中断できます。この場合、以前に使用した名前でこのコンピュータに再接続すると、管理者は切断時に「残した」のと同じ作業環境 (ウィンドウを開いてプログラムを実行している) を受け取ります。セッションから。

インターネット経由でのリモートアクセス

インターネット経由でコンピュータにアクセスするには、ブラウザのアドレス フィールドに http:// と入力します。<имя_cepвepa>/TSWeb 、ここで、server_name は Web サーバー (IIS がインストールされているコンピューター) の DNS 名またはその IP アドレスです。


米。 10.16。 リモート コンピュータへのインターネット接続用のウィンドウ

サーバーに接続すると、「リモート デスクトップ Web 接続」Web ページが表示されます (図 10.16)。ここで、「サーバー」フィールドに接続するコンピューターの名前またはアドレスを指定し、「接続」ボタンをクリックする必要があります。 。 Web サーバーとターゲット コンピュータの名前は異なる場合があることに注意してください。つまり、1 台のコンピュータからネットワークに「入り」ますが、他のコンピュータには接続します。

注意
説明したモードが機能するには、リモート デスクトップ Web 接続コンポーネントが WWW (World Wide Web サービス) の一部としてサーバーにインストールされている必要があります。

この手順を初めて実行するときは、ActiveX コンポーネントがサーバーからダウンロードされ、ローカル コンピュータにインストールする必要があります。 そのウィンドウを図に示します。 10.17。 「はい」をクリックします。


米。 10.17。 ローカル コンピュータへの ActiveX コンポーネントのインストールに関する警告

この後、選択した (ターゲット) コンピュータへの接続が確立され、従来の登録ウィンドウが表示されます。 図では、 例として、図 10.18 は、リモート コンピュータ上のセッションを表示する Internet Explorer ブラウザ ウィンドウを示しています。 アドレス ウィンドウには 1 台のコンピュータ (ネットワークに侵入したコンピュータ) の IP アドレスが表示され、接続は別のコンピュータに行われることに注意してください。そのアドレスは画面の下部に表示されます。 このような画像は、インターネットがインストールされているどのオペレーティング システムでも取得できることを思い出してください。 エクスプローラーのバージョン 4.0以降。 全画面モードでは、ブラウザ パネルはまったく表示されず、リモート コンピュータのデスクトップのみが表示されます。

米。 10.17。 ローカル コンピュータへの ActiveX コンポーネントのインストールに関する警告

この後、選択した (ターゲット) コンピュータへの接続が確立され、従来の登録ウィンドウが表示されます。 図では、 例として、図 10.18 は、リモート コンピュータ上のセッションを表示する Internet Explorer ブラウザ ウィンドウを示しています。 アドレス ウィンドウには 1 台のコンピュータ (ネットワークに侵入したコンピュータ) の IP アドレスが表示され、接続は別のコンピュータに行われることに注意してください。そのアドレスは画面の下部に表示されます。 このような画像は、Internet Explorer バージョン 4.0 以降がインストールされているオペレーティング システムで取得できることを思い出してください。 全画面モードでは、ブラウザ パネルはまったく表示されず、リモート コンピュータのデスクトップのみが表示されます。



システム管理者の間で最もよく行われるタスクの 1 つは、リモート コンピュータ上でコマンドを実行することです。これは、プログラムやユーティリティのインストール、設定の変更などに必要となる場合があります。コマンドが必要になるのは 1 台のコンピュータだけであることはほとんどありません。複数のワークステーションまたはサーバー上で実行します。

この問題はよく知られているため、解決する方法はたくさんあります。 グループ ポリシー (この目的でログイン スクリプトや起動スクリプトを使用できます) から始まり、System Center Essentials や System Center Configuration Manager などの強力な管理システムまでです。 ただし、この記事では、コマンド ラインまたはスクリプト ファイルからすぐに利用でき、エージェントの事前のインストールやその他の面倒な作業を必要としない方法について見ていきたいと思います。 ただし、もちろんいくつかの事前要件があります。 たとえば、コマンドを実行するコンピューターに対する管理者権限が必要です (「プロキシ」シナリオを除く。これについては後で説明します)。

この問題を解決するための私のお気に入りの方法の 1 つは、Mark Russinovich によって作成された PsExec.exe コマンド ライン ユーティリティです。これは Windows SysInternals Web サイトから自由にダウンロードできます。 記事の最後にリンクがあります。 システムにインストールする必要はなく、%path% 環境変数に含まれるフォルダーの 1 つにコピーし、任意のコマンド ライン シェル (Cmd または PowerShell) から呼び出すことができます。

PsExec の使用は非常に簡単です。 たとえば、メイン コンピューターで ipconfig /flushdns を実行するには、次のコマンドを実行するだけです。

psexec\\main ipconfig /flushdns

ipconfig コマンドは、資格情報を使用してメイン コンピューターで実行されます。 ipconfig が完了すると、すべてのテキスト出力がコンピュータに送信され、エラー コードも返されます。 コマンドが正常に実行された場合、値は 0 になります。

もちろん、PsExec の機能はこれで終わりではありません。 パラメーターを指定せずにユーティリティを呼び出すと、使用可能な他のオプションが表示されます。 そのうちのいくつかだけに注目してみます。

-d スイッチは、コマンドが実行されるのを待つ必要はなく、実行するだけで忘れることを PsExec に伝えます。 この場合、コンソール ユーティリティから出力データを受け取りませんが、前のコマンドの完了を待たずに他のユーティリティを起動することができます。 これは、たとえば、複数のコンピュータでプログラム インストーラを実行する必要がある場合に非常に便利です。

デフォルトでは、PsExec はコマンドを隠しモードで実行します。つまり、コマンドが実行されるシステム上ではウィンドウやダイアログは表示されません。 ただし、-i スイッチを使用してこの動作を変更することができます。 その後、ウィンドウを表示するセッション番号を指定できます。指定できない場合は、インターフェイスはコンソール セッションで表示されます。

したがって、メイン コンピューター上のオペレーティング システムのバージョンに関する情報をウィンドウに表示するには、次のように PsExec を実行する必要があります。

psexec -i \\main winver.exe

複数のコンピュータでコマンドを一度に実行したい場合は、リスト テキスト ファイルからコンピュータの名前を読み取ることができると便利です。

psexec @c:\comps.txt systeminfo.exe

PsExec の最も便利な機能の 1 つは、コンピュータ間で入出力を対話的にリダイレクトする機能です。これにより、たとえば、リモート サーバー上で cmd.exe を実行し、それにコマンドを与え、ローカル コンピュータ上で結果を受け取ることができます。 。

PsExec はどのように機能しますか?

独創的なものはすべてシンプルです。 PsExec.exe 実行可能ファイルのリソースには、Windows サービスである別の実行可能ファイル PSEXESVC があります。 コマンドを実行する前に、PsExec はこのリソースをリモート コンピューターの非表示の管理共有フォルダーのファイル \\ComputerName\Admin$\system32\psexesvc.exe に解凍します。 -c スイッチを使用して、実行可能ファイルをこのシステムにコピーする必要があると指定した場合、実行可能ファイルもこのフォルダーにコピーされます。

準備手順が完了すると、PsExec は Windows サービス管理 API を使用してサービスをインストールし、開始します。 PSEXESVC が開始されると、データ (入力コマンド、結果など) を転送するために、PSEXESVC と PsExec の間にいくつかのチャネルが作成されます。 完了すると、PsExec はサービスを停止し、ターゲット コンピューターから削除します。

Windows Management Instrumentation (WMI)

この一般的なタスクを実装する次の方法について説明しますが、Windows Management Instrumentation を使用する方法です。 WMI は Windows 2000 以降のすべての Microsoft オペレーティング システムに存在しており、Windows 9x でも別のパッケージからインストールできます。 WMI はデフォルトで有効になっており、追加の構成は必要ありません。 これを使用するには、管理者権限と、ファイアウォールで許可されている DCOM プロトコルがあれば十分です。 WMI はシステムを管理するための膨大な機能を提供しますが、ここではそのうちの 1 つだけに注目します。

プロセスを開始するには、Win32_Process クラスの Create メソッドが必要です。 使い方はとても簡単です。 PowerShell では、これは次のように行われます。

$Computer = "メイン"
$Command = "cmd.exe /c systeminfo.exe >
("\\$Computer\root\cimv2:Win32_Process").create ($Command)

ここでは、起動するプロセスとして cmd.exe を指定し、必要なコマンドを引数として渡しました。 これは、リモート コンピューターの環境変数または組み込みの cmd.exe ステートメント (">" など) を使用して出力をファイルにリダイレクトする必要がある場合に必要です。 Create メソッドはプロセスの完了を待たず、結果を返しませんが、その識別子 (ProcessID) を示します。

PowerShell がまだインストールされていないコンピューターを使用している場合は、VBScript スクリプトからこの WMI メソッドを呼び出すこともできます。 たとえば次のようになります。

リスト 1 – WMI (VBScript) を使用したプロセスの開始

コンピュータ = 「PC3」
コマンド = "cmd.exe /c systeminfo.exe > \\server\share\%computername%.txt"
Set objWMIService = GetObject("winmgmts:\" & Computer & "\root\cimv2:Win32_Process")
結果 = objWMIService.Create("calc.exe", Null, Null, intProcessID)

ただし、コマンド ライン ユーティリティ wmic.exe を使用する方がはるかに簡単です。これは、WMI を操作するための非常に便利なインターフェイスを提供し、Windows XP 以降のオペレーティング システムに含まれています。 この中で、たとえばメイン コンピューターで電卓を起動するには、次のコマンドを実行するだけです。

wmic /node:main process call create calc.exe

もちろん、WMI の機能はプロセスの起動だけに限定されません。 このテクノロジについてさらに詳しく知りたい場合は、WMI に関する Konstantin Leontiev の記事を読むことをお勧めします。この記事へのリンクは記事の最後にあります。

WSH リモート スクリプト

はい、奇妙なことに、Windows Script Host には他のコンピュータでスクリプトを実行する機能もあります。 確かに、この機能はあまり人気がありません。これはおそらく、必要な準備措置が多すぎて、その代わりに機会がほとんどないという事実が原因と考えられます。 しかし、役に立つかもしれないので、この方法については引き続き説明します。

したがって、WSH を使用して別のコンピューターでスクリプトを実行するには、次の操作を行う必要があります。

リモート コンピューターの管理者権限。 これは言うまでもなく、この記事に記載されている他のほぼすべての起動方法で必要です。 レジストリ キー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings の「1」に等しい文字列 Remote パラメータをシステム レジストリに作成して、WSH リモート スクリプトを有効にします。 Windows XP では、wscript –regserver コマンドを実行する必要がある場合があります。コンピュータがファイアウォールを使用している場合は、DCOM への呼び出しを許可する必要があります。 さらに、これは管理対象コンピュータだけでなく、スクリプトを実行するコンピュータでも実行する必要があります。 Service Pack 2 以降を適用した Windows XP システムでは、DCOM セキュリティ設定を変更する必要があります。 これはグループ ポリシーを使用して実行できます。 [コンピューターの構成]\[Windows 設定]\[セキュリティ設定]\[ローカル ポリシー]\[セキュリティ オプション] ノードで、アクセス許可を次のように設定する必要があります。 DCOM: セキュリティ記述子定義言語 (SDDL) 構文のマシン アクセス制限
匿名ログオンおよび全員にアクセス許可を付与する ローカル アクセスを許可およびリモート アクセスを許可する DCOM: セキュリティ記述子定義言語 (SDDL) 構文でのマシン起動制限
管理者グループに権限を付与します。 ローカル起動を許可、リモート起動を許可、ローカル アクティベーションを許可、リモート アクティベーションを許可
Everyone グループ – ローカル起動を許可、ローカルアクティベーションを許可

さて、これらの手順をすべて行った後、別のコンピュータでスクリプトを実行してみることができます。

このテクノロジーを使用するスクリプトの例:

リスト #2 – WSH リモート スクリプト (VBScript)

objController = CreateObject("WshController") を設定します
Set objRemoteScript = objController.CreateScript("C:\test.vbs", "PC5")WScript.ConnectObject objRemoteScript, "remote_"
objRemoteScript.Execute
Do While objRemoteScript.Status 1
WScript.Sleep 1000
ループ
MsgBox "スクリプトが完了しました"
サブリモート_エラー
Dim objError
objError = objRemoteScript.Error を設定します
WScript.Echo "エラー - 行: " & objError.Line & _
", Char: " & objError.Character & vbCrLf & _
"説明: " & objError.Description
WScript.終了 –1
エンドサブ

2 行目では、リモート コンピューター上で実行されるスクリプト ファイルへのパスと、このコンピューターの実際の名前が、CreateScript 関数のパラメーターとして指定されます。

タスクスケジューラ

タスク スケジューラは、at.exe と schtasks.exe という 2 つのユーティリティを使用してコマンド ラインから制御できます。 これらのユーティリティは両方とも、リモート コンピュータの名前を指定してタスクを作成できるため、問題を解決できます。 ただし、schtasks.exe にはさらに多くの機能があるため、ここでは schtasks.exe についてのみ詳しく説明します。

他のコンピューターでコマンドを実行することはスケジューラーの主な目的ではありませんが、それにもかかわらず、多くの興味深いシナリオを実装することができます。 たとえば、これを使用して、昼休み中にソフトウェアのインストールを有効にすることができます。 または、ユーザーが異なる時間に昼食をとる場合は、コンピュータが一定時間非アクティブになった後に起動を実行できます。

schtasks /create /s server6.td.local /tn install /tr \\main\data\install.cmd /sc Once /st 13:00 /ru system

どのアカウントでタスクが実行されるかを理解することが重要です。 この例では、/ru パラメーターの値システムを指定したため、コンピューター アカウントをインストールするには、プログラム配布キットを使用してネットワーク フォルダーへの読み取りアクセスが必要になります。

もう 1 つの有効な解決策は、毎日実行するアクションをスケジュールし、成功が確認された場合にのみタスクを削除することだと思われます。 つまり、最初にプログラム インストーラーを起動し、完了するのを待って、プログラムが正常にインストールされたかどうかを確認する単純なバッチ ファイルを作成できます。 存在する場合、そのコンピュータのスケジューラからジョブが削除されます。 そのようなファイルの例:

リスト 3 – プログラムのインストールとタスクの削除 (Windows バッチ)

msiexec /qn /package \\server\share\subinacl.msi
存在する場合 "c:\program files\Windows Resource Kits\Tools\subinacl.exe" (
subinacl /tn Install_Subinacl /f
)

WinRM (WS 管理)

WinRM は、Web サービスを使用してシステムを管理できるようにする Microsoft のオープン スタンダード DMTF (Distributed Management Task Force) の実装です。 このテクノロジーの構造についてはこれ以上深くは説明しませんが、それを使用するために必要なことについて簡単に説明します。

WinRM バージョン 1 以降は、Windows Vista および Windows Server 2008 以降のオペレーティング システムに含まれています。Windows XP および Windows Server 2003 の場合は、WinRM を別のパッケージとしてインストールできます (リンクを参照)。

標準ポートを使用してコンピュータに接続し、管理アカウントへの接続を許可するようにコンピュータをすばやく設定するには、次のコマンドを実行するだけです。

winrmクイック構成

winrm が確認を求めないようにするには、呼び出しに -quiet スイッチを追加します。 組み込みの winrm ヘルプの微調整に関する情報を見つけることができます。

winrm ヘルプ構成

Web サーバーが管理対象コンピューター上で実行されている場合、WinRM はデフォルトで標準の HTTP ポートを使用しますが、いかなる形でも Web サーバーに干渉しません。 特にそれ専用の接続のみをインターセプトします。

もちろん、管理するすべてのコンピューターでこのコマンドを手動で実行する必要はありません。 必要な設定はすべてグループ ポリシーを使用して簡単に行うことができます。 これを行うには、次のものが必要です。

WinRM (Windows リモート管理) サービスを自動的に開始するように構成する グループ ポリシー項目 [コンピューターの構成\管理用テンプレート\Windows コンポーネント\Windows リモート管理 (WinRM)\WinRM サービス\リスナーの自動構成を許可する] を構成します。 ここでは、接続を許可する IP アドレスの範囲を指定する必要があります。 もちろん、Windows ファイアウォールで適切なポート (デフォルトでは 80) への接続を許可する必要もあります。

HTTP (80) ポートが使用されるか HTTPS (443) ポートが使用されるかに関係なく、WinRM によって送信されるトラフィックは暗号化されます (もちろん、このオプションを無効にしない限り)。 デフォルトの認証プロトコルは Kerberos です。

設定については十分なので、直接使用してみましょう。 winrm ユーティリティを使用すると、WinRM サービスを構成したり、WMI クエリなどを実行したりできますが、私たちは別のユーティリティである winrs にもっと興味があります。 ここでの RS という文字はリモート シェルを表します。 WinRS は WinRM テクノロジを使用していますが、PsExec と非常によく似ています。 コンピューター名は -r スイッチで指定され、その後に実行するコマンドが続きます。 以下にいくつかの例を示します。

winrs -r:コアver.exe

winrs はすでに cmd.exe をリモート シェルとして使用しているため、コマンドでリモート環境変数に簡単にアクセスしたり、他の cmd.exe 組み込みコマンドを使用したりできます。

winrs -r:Core "ディレクトリ c:\temp > c:\temp\list.txt"

PsExec と同様に、winrs ユーティリティを使用すると、リモート コンピューター上で対話型セッションを開くことができます。

winrs -r:main cmd.exe

この機能は Telnet セッションに似ていますが、セキュリティの観点からは、winrs を使用する方が Telnet や PsExec よりも確実に優れています。 ポートが HTTP (80) であるか HTTPS (443) であるかに関係なく、WinRM によって送信されるトラフィックは暗号化されます (もちろん、このオプションを無効にしない限り)。 デフォルトの認証プロトコルは Kerberos です。

Windows PowerShell 2.0 リモート処理

Windows PowerShell の 2 番目のバージョンは、この記事の執筆時点ではまだベータ テスト中ですが、リモート コマンド実行の分野におけるその機能については、今から議論する価値があることは間違いありません。 プレビュー バージョン (リンクを参照) をダウンロードするか、Windows 7 または Windows Server 2008 R2 のベータ版の一部として、自分で試すことができます。

PowerShell Remoting インフラストラクチャは WinRM バージョン 2.0 に基づいているため、送信データの暗号化や標準の HTTP/HTTPS ポートで動作する機能など、このテクノロジの利点をすべて継承しています。 でも、豊富なチャンスのおかげで、 Windows言語 PowerShell とそのオブジェクトを操作する機能により、さらに強力な機能が得られます。 現時点では、WinRM2.0 パッケージもベータ テスト中であり、Windows Vista および Windows 2008 システムに対してのみダウンロードできます。PowerShell 2.0 と同様に、最初は Windows 7 および Windows Server 2008R2 システムに組み込まれる予定です。

更新: この記事が ItBand.ru で公開されるまでに、PowerShell 2.0 および WinRM 2.0 の最終バージョンは、サポートされているすべてのプラットフォームですでに利用可能になっています。 Windows Server 2008R2 および Windows 7 では、これらはシステムの統合コンポーネントとしてすでに組み込まれており、Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008 では、必要なすべてのコンポーネントが Windows というパッケージの形式で入手できます。管理フレームワーク。

これらすべての利点を活用するには、マネージャーと管理対象コンピューターの両方で PowerShell リモート処理を有効にする必要があります。 これは、コマンドレット (Windows PowerShell コマンド) Enable-PSRemoting を実行することで簡単に実行できます。 また、-Force キーを追加すると、確認は要求されません。 このコマンドレットは、必要に応じて winrs Quickconfig を呼び出し、Windows ファイアウォールに例外を作成するため、追加の手順を実行する必要はありません。

この後、Invoke-Command コマンドレット (またはそのエイリアス icm) を使用して、他のコンピューターでコマンドを簡単に実行できます。

Invoke-Command -ComputerName Main -ScriptBlock (netsh インターフェイス ダンプ > c:\ipconfig.txt)

もちろん、コマンドを事前に変数に入れることもできます。また、-ComputerName パラメーターには、1 台ではなく複数のコンピューターの名前を一度に指定できます。 次のシーケンスにより、3 台のコンピュータの Explorer.exe ファイルのバージョンを一度に表示できます。

$Command = ((get-item c:\Windows\explorer.exe).VersionInfo.FileVersion)
Invoke-Command -ComputerName Main、Server7、Replica -ScriptBlock $Command

ご覧のとおり、1 つのブロックで複数のコマンドを一度に渡し、その実行結果を複数のコンピューター上の変数に配置し、Windows PowerShell のオブジェクト操作機能を使用してワークステーション上で処理できます。

ただし、PowerShell Remoting の機能はまだ始まったばかりです。 Enter-PSSession コマンドレットを使用して、リモート コンピューター上の対話型 Windows PowerShell セッションにログインできます。 このようなセッションは、Exit-PSSession コマンドレットを使用して終了するか、単に終了することができます。

New-PSSession コマンドレットは、リモート コンピューター上にセッションを作成し、そのポインターを変数に配置して、引数として Invoke-Command に渡して、永続的な環境で複数のコンピューター上でコマンドを同時に実行します。 スクリーンショットの例では、リスト c:\computers.txt から複数のコンピューターで一連のコマンドを一度に実行しています。

プロキシ中

この方法は上記のすべての方法とは異なり、まったく異なるタスクを実行しますが、関連性は劣りません。 権限の委任が不可能な場合、または提供される権限が多すぎる場合、標準ユーザーは、追加の権限を付与したり、管理者のパスワードを侵害したりすることなく、管理者特権を必要とするコマンドを実行できます。

ほとんどの場合、このような問題は、cpau.exe (リンクを参照) などのユーティリティを使用して解決します。このユーティリティは、特定のプログラムの実行を許可する管理者アカウントの暗号化されたパスワードを含むファイルを作成します。 ただし、問題は、パスワードが暗号化されていても、ユーティリティはプログラムを実行する前にパスワードを復号化する必要があることです。 したがって、ユーザーはパスワード解読アルゴリズムを繰り返し実行してそれを見つけるユーティリティを使用でき、これを使用して他のプログラムを起動したり、追加の権限を取得したりできます。 もちろん、実際には、特別な知識を持たない一般ユーザーにとってこれは非常に困難ですが、それでも十分に可能です。 もう一度明確にしておきますが、これは特定のユーティリティの問題ではなく、このアプローチ全体の問題です。

runas ユーティリティの /savecred パラメータが問題の解決に適していると思われる場合もあります。 しかし、ここにはさらに 2 つの問題があります。 まず、上記の場合と同様に、パスワードはユーザーのコンピュータに保存されるため、復号化できますが、runas の場合はローカル管理者権限が必要です。 次に、runas は資格情報を特定のコマンドに関連付けずに保存するため、ユーザーはアクセス権を付与したいコマンドだけでなく、その他のコマンドも高い権限で実行できるようになります。

これらの問題を回避しながら特定のコマンドの実行を許可するには、「プロキシ」と呼ばれる手法を使用できます。

以下のように動作します。 高い権限を持つスクリプトがコンピューター上で常に実行されています。 たとえば、この例では、ファイル サーバーの管理者権限を持つアカウントから起動します。 ユーザーの信号により、あらかじめ決められた 1 つのコマンドが実行されます。 この例では、ネットワーク上で開いているすべてのファイルを閉じます。

このシステムを整理するには、コマンド ファイル Server.cmd と Action.cmd をサーバー (たとえば、c:\scripts\ フォルダー) に配置します。

リスト 4 – Server.cmd (Windows バッチ)

set トリガー=c:\commandShare\trigger.txt
set action=c:\scripts\action.cmd
set log=c:\scripts\log.txt
:始める
存在する場合 %trigger% start %action% & echo %time% %date%>>%log% & del %trigger%
スリープ.exe 5
スタートに移動

リスト 5 – Action.cmd (Windows バッチ)

for /f “skip=4 tokens=1” %%a in ('net files') do net files %%a /close
出口

Server.cmd は、ユーザーからのサイン (特定の場所にファイルを作成する) を待ち、それを受け取ると、コマンド - Action.cmd を使用してファイルを起動します。 もちろん、ユーザーはこのフォルダーにアクセスできません。 スケジューラで適切なタスクを作成するだけで、コンピュータの起動時に Server.cmd が自動的に開始されるように構成できます。

schtasks /create /ru ドメイン\管理者 /rp /sc onstart /tn ProxyScript /tr c:\scripts\server.cmd

/ru パラメータの後には、スクリプトが実行されるアカウントが示されます (この例では、サーバー上で管理者権限を持っています)。これは、/rp パラメータの後にパスワードが指定されていないためです。パスワードは、ファイルの作成時に要求されます。タスク。 /sc パラメーターを使用すると、スクリプトが起動される瞬間 (この場合はコンピューターの電源が入ったとき) を指定できます。 /tn と /tr を使用すると、タスクの名前と実行可能ファイルを指定できます。

ここで、ユーザーがスクリプトに通知できるように、フォルダー c:\commandShare を作成し、ネットワーク経由でアクセスできるようにします。 コマンドを実行するユーザーのみが、このフォルダーへの書き込みアクセス権を持つ必要があります。

この後、ユーザーは Run.cmd ファイルをデスクトップに配置するだけで十分です。

リスト 6 – Run.cmd (Windows バッチ)

エコー テスト > \\server\commandShare\trigger.txt

ユーザーに代わって実行すると、ファイル \\server\commandShare\trigger.txt が作成されます。 これに気付いた Server.cmd スクリプトは、その権限で Action.cmd ファイルを起動し、現在時刻に関するエントリを c:\scripts\log.txt ファイルに追加してから、trigger.txt を削除します。次のユーザー信号が届くまで、コマンドを再度実行します。

Server.cmd スクリプトは Sleep.exe ユーティリティを使用します。これにより、秒単位で指定された期間、スクリプトの実行を一時停止できます。 これはオペレーティング システムには含まれていませんが、リソース キット ツール (リンクを参照) から取得して任意のコンピューターにコピーすることができます。

役に立ちます

外国語を学ぶことに決めましたか? 家庭教師 英語これを手伝ってくれるでしょう。 そこでは他のユーザーと一緒に練習することができます。