WinServer 2012R2 の RDP ユーザー セッションへの非管理者のヒューマン シャドウ接続用ユーティリティ

企業の隔離期間中の問題は次のようなものでした。アプリケーション ソフトウェアのサービスやコンサルティングを行う専門家がオフィスを訪問する回数を最小限に抑える必要があるのですが、率直に言って、ユーザーは詳細を調べようとせずに専門家の助けを乱用することがよくあります。この問題自体について、彼らは「彼らは来るだろう、助けてくれるだろう、やってくれるだろう、しかし私は喫煙したりコーヒーを飲んだりするだろう」と言います。 サーバー共有時の電話相談は、リモート画面をご覧いただくとより効果的です。

WinServer 2012R2 の RDP ユーザー セッションへの非管理者のヒューマン シャドウ接続用ユーティリティ

私たちの自転車が「発明」された後、記事のテーマに関するまともな情報が判明しました。 RDS Shadow – Windows Server 2012 R2 の RDP ユーザー セッションへのシャドウ接続 または Windowsサーバーの非特権ユーザーシャドウモード または RDP セッションの管理の委任。 単純な対話の要素も含めて、それらはすべてコンソールの使用を伴います。

以下のすべての情報は、次のような方を対象としています。 異常な倒錯を普通に許容する 望ましい結果を得るために、不必要な方法を発明します。
「猫の尻尾を掴む」ことのないように、最後の点から始めます。自転車は、ユーティリティを使用する平均的なユーザーにとって機能します。 アドミリンク、作者に感謝します。

I. コンソールとシャドウ RDP。

と一緒に使っているので、 サーバー マネージャー コンソールの管理者権限 -> QuickSessionCollection -> 対象のユーザーのセッションをクリックし、コンテキスト メニューから [Shadow] を選択します。 ソフトウェアの使用方法を指導する担当者向け、というオプションはありません。別の「木製」方法が検討されました。

1. セッションの RDP ID を確認します。

query user | findstr Administrator

または

qwinsta | findstr Administrator 

さらに "| findstr 管理者「正確に何かを知っている場合にのみ便利でした 管理者 サーバーにログインしている全員を確認するには、最初の部分だけを使用する必要があります。または、最初の部分のみを使用します。

WinServer 2012R2 の RDP ユーザー セッションへの非管理者のヒューマン シャドウ接続用ユーティリティ

2. ドメイン内にある場合は、このセッションに接続します。 グループポリシー [リモート デスクトップ サービスのユーザー セッションのリモート コントロール ルールを設定する] オプションが選択されており、少なくとも [ユーザー権限でセッションを監視する] オプションが選択されています (もっと):

mstsc /shadow:127

リストにはユーザーのログインのみが含まれることに注意してください。

繰り返しますが、管理者権限がないと、次のような結果になります。

WinServer 2012R2 の RDP ユーザー セッションへの非管理者のヒューマン シャドウ接続用ユーティリティ

ただし、これから説明するプログラムの事前デバッグには、管理者権限を持つアカウントを使用しました。

II. プログラム

つまり、問題のステートメントは、ユーザーの許可を得てユーザーの影の感覚に接続するための単純なグラフィカル インターフェイスを作成し、ユーザーにメッセージを送信することです。 選択したプログラミング環境は Lazarus です。

1. ユーザーの「ログイン」-「フルネーム」の完全なドメインリストを管理者から、またはコンソールから再度取得します。

wmic useraccount get Name,FullName 

これさえも誰も禁止しません。

wmic useraccount get Name,FullName > c:testusername.txt

このファイルの処理に問題があったのは Lazarus であるとすぐに言います。デフォルトでは、Lazarus のエンコーディングは UCS-2 であるため、手動で通常の UTF-8 に変換する必要がありました。 ファイル構造には多くのタブ、または多くのスペースがあり、プログラムで処理することが決定されています。遅かれ早かれ、エンコードの問題は解決され、ファイルはプログラムで更新されるでしょう。

したがって、アイデアは、プログラムのユーザーがアクセスできるフォルダー (たとえば、c:test) を用意し、その中に 2 つのファイルが存在するようにすることです。最初のファイルにはログインとフルネームが含まれ、もう XNUMX つは id_rdp とユーザーのログインが含まれます。 次に、このデータをできる限り最善の方法で処理します :)。

その間に、セッションのリストに関連付けるために、この内容 (ログイン名とフルネーム) を配列に転送します。

procedure Tf_rdp.UserF2Array;
var 
  F:TextFile;   i:integer;   f1, line1:String;   fL: TStringList;
begin //f_d глобальный путь к размещению файлов 
f1:=f_d+'user_name.txt';     //задача считать в массив содержимое файла
fL := TStringList.Create; // строку подвергнем метамарфозам с разделителями
fL.Delimiter := '|'; fL.StrictDelimiter := True;
AssignFile(F,f1); 
try // Открыть файл для чтения
  reset(F); ReadLn(F,line1);
  i:=0;
while not eof(F) do // Считываем строки, пока не закончится файл
begin
ReadLn(F,line1);
line1:= StringReplace(line1, '  ', '|',[]); //заменяем первый попавш.2пробела разделителем |
// удаляем все двойные пробелы
while pos('  ',line1)>0 do line1:= StringReplace(line1, '  ', ' ', [rfReplaceAll]);
begin
if (pos('|',line1)>0) then
begin //если разделитель существует заносим его в массив
fL.DelimitedText :=line1; // разбиваем на столбцы
if (fL[0]<>'') then //если учетка имеет имя
begin //вносим ее в массив
 inc(i); // избавляемся от возможных одиночных пробелов в логине
 fam[0,i]:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]);
 fam[1,i]:=fL[0];
 end;end;end;end; // Готово. Закрываем файл.
 CloseFile(F);
 Fl.Free;
 except
 on E: EInOutError do  ShowMessage('Ошибка обработки файла. Детали: '+E.Message);
 end;end;

「コードが多くて」申し訳ありません。以下の点をより簡潔に説明します。

2. 前の段落と同じ方法を使用して、リストの処理結果を StringGrid 要素に読み込みます。ここで「重要な」コード部分を示します。

2.1 RDP セッションの現在のリストをファイルで受け取ります。

f1:=f_d+'user.txt';
cmdline:='/c query user >'+ f1;
if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1)=0 then;
Sleep(500); // можно и подольше ждать пока файл для чтения создается

2.2 ファイルを処理します (コードの重要な行のみが示されています)。

StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; //кидаем в цикле в StringGrid1
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); //убираем из логина пробелы
if (SearchArr(login1)>=0) then //ищем в массиве из п1. логин и записываем в таблицу ФИО
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; // либо записываем плюсик:)
.... //в зависимости от выбора пользователя сортируем и форматируем по данным
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2);  

3. ユーザーとそのセッション番号の行をクリックして直接接続します。

  id:=(StringGrid1.Row);// узнаем номер строки  IntToStr(StringGrid1.Row)
  ids:=StringGrid1.Cells[2,id]; //получаем идентификатор rdp
  cmdline:='/c mstsc /shadow:'+ ids; //и подключаемся....
 if (b_rdp.Checked=True) then  if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then;       

4. ラジオボタンをクリックして並べ替えたり、ユーザーまたはすべてのユーザーにメッセージを送信したりするなど、さらにいくつかの装飾が行われました。

WinServer 2012R2 の RDP ユーザー セッションへの非管理者のヒューマン シャドウ接続用ユーティリティ

→完全なソースコードが見られます ここで

Ⅲ. AdminLink の使用 - 私が見たこと:

AdminLink は、ユーティリティの場所を参照するショートカットを生成します。 admilaunch.exe、および起動ユーティリティの個人用コピー AdmiRun.Exe これはユーザーのフォルダーにあります。たとえば、 vasya、 タイプ C:UsersvasyaWINDOWS。 一般に、すべてがそれほど悪いわけではありません。ショートカット ファイルやその他のアクセス権をいじって、管理者の良心を晴らすこともできます。

出所: habr.com

コメントを追加します