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 

而且 ”| 尋找str管理員「只有當你知道到底是什麼時才方便 管理員 您需要,或僅使用第一部分來查看登入伺服器的每個人。

WinServer 2012R2 中非管理員與 RDP 使用者會話的人影連接實用程式

2. 連接到此會話,前提是在網域中 團體政策 選擇「為遠端桌面服務的使用者會話設定遠端控制規則」選項,並至少選擇「使用使用者權限監控會話」選項(更多):

mstsc /shadow:127

請注意,該清單僅包含使用者登入資訊。

我再說一遍,如果沒有管理員權限,您將獲得以下資訊:

WinServer 2012R2 中非管理員與 RDP 使用者會話的人影連接實用程式

但為了對即將討論的程式進行初步調試,我使用了具有管理員權限的帳戶。

二. 程式

所以問題陳述:創建一些簡單的圖形介面,在使用者允許的情況下連接到使用者的影子感知,向使用者發送訊息。 選擇的程式環境是Lazarus。

1. 我們從管理員那裡獲取使用者「登入名稱」-「全名」的完整網域列表,或再次透過控制台:

wmic useraccount get Name,FullName 

甚至沒有人禁止這一點:

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

我馬上就會說是 Lazarus 在處理這個檔案時遇到了問題,因為預設情況下它的編碼是 UCS-2,所以我只需手動將其轉換為常規 UTF-8。 文件結構中有很多製表符,或者更確切地說是很多空格,決定以編程方式處理它們;編碼問題遲早會得到解決,並且文件將以編程方式更新。

因此,我們的想法是建立一個可供程式使用者存取的資料夾,例如 c:test,其中有 2 個檔案:第一個包含登入名稱和全名,第二個包含 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 例如,它位於使用者的資料夾中 瓦夏, 類型 C:UsersvasyaWINDOWS。 一般來說,並不是一切都那麼糟糕:您可以嘗試使用捷徑檔案和其他檔案的存取權限來澄清您自己的管理良心。

來源: www.habr.com

添加評論