web-dev-qa-db-ja.com

Windows7のユーザーログオフスクリプトを強制する

Windows 7 Home Premiumのコマンドラインから別のユーザーに強制的にログオフさせる方法はありますか?

私の仕事用VPNポリシーでは、ログインしているユーザーは1人だけである必要があります。他のユーザーをログオフするには、管理者としてプロンプトコマンドを実行し、タスクマネージャーを実行してから、右クリックしてログオフする必要があります。これは少し面倒です。理想的には、実行可能ファイルまたはバッチスクリプトを実行して、すべてを1つの簡単なステップで実行したいと思います。設定されたタイムアウト後にユーザーをログオフすることについて話しているいくつかのスレッドに出くわしました、そしてそれもうまくいくかもしれません(うまくいくものがあると仮定して...私の発見はないということです)-しかし私はまだ欲しいです可能であれば、1つのステップでそれを行う方法を知ること。

私が求めていることを行う方法はありますか?

必要に応じて、.netアプリを作成することに反対していません。

5
javamonkey79

このバッチファイル( ここ から適応)のようなものを使用して、logoffコマンドを自動化できます。

@echo off
query session > c:\temp\session.txt
for /f "skip=2 tokens=2,3,4" %%i in (c:\temp\session.txt) DO if not "%%i"=="Geoff" logoff %%j
del c:\temp\session.txt
pause

これは、 query session コマンドを使用してセッションのリストを取得し、次に for コマンドを使用して出力を解析し、最後に logoff コマンドを使用してログに記録します。他のユーザーをオフにします。 query sessionコマンドを実行して、マシンの出力を確認することをお勧めします。

私のマシンでは、次のようになります。

C:\Users\Geoff\Desktop>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           Geoff                     1  Active

最初の2行はガベージであるため、skip 2部分はそれらを無視します。ユーザー名、ID、および状態は、それぞれi、j、およびk変数に入れられます。テストする必要があります。管理者以外のユーザーとして実行されない場合は、デスクトップでファイルを右クリックして[管理者として実行]を選択するか、バッチファイルへのショートカットを作成します。 、次に[プロパティ]、[プロパティ]の順に選択します。ショートカット|上級|管理者として実行。どちらの方法でも、UACプロンプトが表示されます。最後に、UACプロンプトなしでバッチファイルを実行する場合は、よりあいまいなタスクスケジューラルートに進むことができます。 この投稿 を参照してください。

4
Geoff

MSから PSShutdown をチェックしてください。 -oオプションとともに使用して、コンソールユーザーからログオフし、ワンクリック(または右クリック>管理者として実行)で実行できるバッチファイルを作成できます。

PsShutdownは、Windows 2000 Resource Kitのシャットダウンユーティリティに似たコマンドラインユーティリティですが、さらに多くの機能を備えています。 PsShutdownは、ローカルコンピューターまたはリモートコンピューターをシャットダウンまたは再起動するための同じオプションをサポートすることに加えて、コンソールユーザーをログオフしたり、コンソールをロックしたりできます(ロックにはWindows 2000以降が必要です)。

また、この質問をチェックしてください: ユーザーアカウントのタイムアウト?

2

これは、イベントによってトリガーされる強制ログオフについて説明しているThe ScriptingGuysの興味深い記事です。

http://blogs.technet.com/b/heyscriptingguy/archive/2010/06/10/hey-scripting-guy-how-can-i-log-out-a-user-if-they- launch-a-particular-application.aspx

ユーザーAによるログオンまたはExplorer.exeの起動をトリガーイベントとして使用して、ユーザーBをログアウトできるとします。

1
Yevgeniy

私の 他の答え (この質問は私に考えさせられました!)の代わりとして、2つのものの組み合わせを使用することを検討することもできます:

  1. ログオフスクリプトを実行するために、各ワークステーションでスケジュールされたタスクを設定します。トリガーは特定のイベントログエントリになります。
  2. 自分のデスクトップで.vbsスクリプトを使用して、トリガーエントリをイベントログに投稿します。

これらを順番に取る:

スケジュールされたタスク

各ユーザーとしてログインし、カスタムトリガーを使用して新しいタスクを追加する必要があると思います。新規| 「イベントについて」|カスタム|新しいイベントフィルター| XML | 「手動で編集」。次に、XMLに次のようなものを使用します。

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[(Level=4 or Level=0) and (EventID=4)]] and *[EventData[Data[1]='EVERYBODY_OFF']]</Select>
  </Query>
</QueryList>

これにより、EventIDが4(情報)でデータ本体が「EVERYBODY_OFF」のアプリケーションログで情報イベントが検索されます。イベントトリガーの詳細については、 ここ を参照してください。

アクションはshutdown -lのように単純である必要があります。これにより、ログオフがトリガーされます(テストする必要があります)。

トリガースクリプト

次の.vbsスクリプトは、オンデマンドで「EVERYBODY_OFF」イベントをログに記録します。

const EVENTLOG_INFORMATION = 4
strMessage = "EVERYBODY_OFF"
set objShell = CreateObject("WScript.Shell")
objShell.LogEvent EVENTLOG_INFORMATION, strMessage

テストするもの

私が確信していないビット、そしてそれは少しテストが必要です:

  • それは、マシンにグローバルに投稿されるイベントメッセージですか?つまり、すべてのユーザーにタスクが表示されますか?
  • シャットダウンコマンドは、ターゲットユーザーのコンテキストで正しく実行されますか?
1
Geoff