6

私は現在、いくつかのペアレンタル コントロール ソフトウェアに取り組んでいます。このソフトウェアは、ユーザーをログアウトしてからアカウントをロックし、親/管理者が指定しない限り再度ログインできないようにすることになっています。

これまでに、ユーザー アカウントが無効であることを示すフラグを設定するなど、いくつかのことを試しました。これにより、ログイン画面から完全に削除されます。私が見つけたのは、ユーザー アカウントがログインしている場合、ADS_Disable フラグが適用されないということです。別のアカウントのログアウトに関するリソースも探してみましたが、logout コマンドを実行しているアカウントのログアウトに関する情報しか見つからないようです。Pinvokeなど、またはLOGOUT.EXEプログラムを直接呼び出します。

LSAUserでリソースを見つけたところ、そこに何かがあるかもしれないことがわかりました。私は学校のためにこのプロジェクトを行っていますが、少し指導が必要です。これを行うには非常にまばらな量の情報があるため、私がやりたいことを行うためのより良い方法はありますか? それとも、これをしてはいけない理由がありますか?代替案はありますか?

4

3 に答える 3

13

WTSDisconnectSession()Windows APIを使用します。こちらの記事を参照してください。

using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

class Program
{
  [DllImport("wtsapi32.dll", SetLastError = true)]
  static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);

  [DllImport("Kernel32.dll", SetLastError = true)]         
  static extern int WTSGetActiveConsoleSessionId();

  const int WTS_CURRENT_SESSION = -1;
  static readonly IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;

  static void Main(string[] args)
  {
    if (!WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE,
         WTS_CURRENT_SESSION, false))
      throw new Win32Exception();
  }
}

リモート デスクトップがなくても、現在のユーザーが切断され、ログイン画面に移動します。プロセスは引き続きバックグラウンドで実行されます。手動で再度ログインすると、実行中のプログラムは切断前と同じように表示されます。

于 2013-01-22T20:40:35.020 に答える
5
  [DllImport("wtsapi32.dll", SetLastError = true)]
  static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);


リモート デスクトップでWTSDisconnectSession を使用する場合、リモート デスクトップ ウィンドウを「閉じる」のと同じです。Windows セッションを切断しますが、接続を保持します。

利点は、再度リモート ログインすることで、後でセッションに再接続できることです。
欠点は、リモート デスクトップ接続がいっぱいになると、他のユーザーが Windows にログインできない可能性があることです。


Windows の「ログオフ」をシミュレートするには、user32.dll の下でExitWindowsExを使用する必要があります。

[DllImport("user32.dll", SetLastError = true)]
static extern bool ExitWindowsEx(uint uFlags, uint dwReason);

public static bool WindowsLogOff() {
  return ExitWindowsEx(0, 0);
}

ユーザーにログオフを強制する場合は、次のEWX_FORCEようなフラグを追加する必要があります。

ExitWindowsEx(0 | 0x00000004, 0);

関数の詳細については、https ://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx をご覧ください。

于 2013-11-19T08:01:01.630 に答える
2

Leng Weh Seng の回答に便乗して (コメントできないため)、ユーザーを強制的にログオフさせたい場合は、次のように EWX_FORCE フラグを追加する必要があります。

ExitWindowsEx(0 | 0x00000004, 0);

関数の詳細については、https ://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx を参照してください。

于 2017-07-28T17:34:06.980 に答える