Utilitar pentru conexiunea umbră umană a sesiunilor de utilizatori non-administratori la RDP în WinServer 2012R2

Problema în perioada de carantină a întreprinderii a devenit următoarea: este într-adevăr necesar să se minimizeze numărul de vizite la birouri ale specialiștilor care deservesc și consultă cu privire la software-ul aplicației și, sincer vorbind, utilizatorii abuzează adesea de ajutorul specialiștilor fără a dori să aprofundeze problema în sine, ei spun „vor veni - vor ajuta - o vor face, dar voi fuma/bea cafea, etc.” Consultarea telefonică atunci când partajați un server este mai eficientă dacă vizualizați ecranul de la distanță.

Utilitar pentru conexiunea umbră umană a sesiunilor de utilizatori non-administratori la RDP în WinServer 2012R2

După „inventarea” bicicletei noastre, au apărut informații sănătoase despre subiectul articolului: RDS Shadow – conexiune shadow la sesiunile RDP ale utilizatorilor din Windows Server 2012 R2 sau Режим shadow непривилегированного пользователя в windows server sau Delegarea managementului sesiunilor RDP. Toate implică utilizarea unei console, chiar și cu elemente de dialog simplu.

Toate informațiile de mai jos sunt destinate celor care tolerează în mod normal perversiunile anormale pentru a obține rezultatul dorit, inventând metode inutile.
Pentru a nu „trage pisica de coadă”, voi începe cu ultima: bicicleta funcționează pentru utilizatorul obișnuit care folosește utilitarul AdmiLink, pentru care mulțumesc autorului său.

I. Consolă și RDP umbră.

De când se utilizează cu drepturi de administrator ale consolei Server Manager -> QuickSessionCollection -> făcând clic pe sesiunea utilizatorului de interes, selectând Shadow din meniul contextual pentru personalul care instruiește modul de utilizare a software-ului, nu este o opțiune, a fost luată în considerare o altă metodă „de lemn”, și anume:

1. Aflați ID-ul RDP al sesiunii:

query user | findstr Administrator

sau:

qwinsta | findstr Administrator 

În plus "| findstr Administrator„era convenabil doar când știai ce anume Administrator de care aveți nevoie sau utilizați doar prima parte pentru a vedea pe toți conectați la server.

Utilitar pentru conexiunea umbră umană a sesiunilor de utilizatori non-administratori la RDP în WinServer 2012R2

2. Conectați-vă la această sesiune, cu condiția ca în domeniu politici de grup Opțiunea „Configurați regulile de control de la distanță pentru sesiunile de utilizator ale Serviciilor Desktop la distanță” este selectată cu cel puțin opțiunea „Monitorizați sesiunea cu permisiunea utilizatorului” (mai mult):

mstsc /shadow:127

Vă rugăm să rețineți că lista va conține doar autentificarea utilizatorilor.

Repet că fără drepturi de administrator veți obține următoarele:

Utilitar pentru conexiunea umbră umană a sesiunilor de utilizatori non-administratori la RDP în WinServer 2012R2

Dar pentru depanarea preliminară a programului care va fi discutat, am folosit un cont cu drepturi de administrator.

II. Program

Deci declarația problemei: crearea unei interfețe grafice simple pentru a se conecta la simțul umbră al utilizatorului cu permisiunea acestuia, trimițând un mesaj utilizatorului. Mediul de programare ales este Lazarus.

1. Obținem lista completă de domenii a utilizatorilor „login” - „nume complet” de la administrator sau din nou prin consolă:

wmic useraccount get Name,FullName 

nimeni nu interzice nici asta:

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

Voi spune imediat că Lazarus a avut o problemă cu procesarea acestui fișier, deoarece codificarea lui implicită este UCS-2, așa că a trebuit doar să-l convertesc manual în UTF-8 obișnuit. Există o mulțime de file în structura fișierului, sau mai degrabă o mulțime de spații, pe care s-a decis să le proceseze programatic, mai devreme sau mai târziu, problema de codificare va fi rezolvată, iar fișierul va fi actualizat programatic;

Deci, ideea este să avem un folder accesibil utilizatorilor programului, de exemplu c:test, în care vor fi 2 fișiere: primul cu login și fullname, al doilea cu id_rdp și login al utilizatorilor. În continuare, procesăm aceste date cât de bine putem :).

Între timp, pentru a ne asocia cu lista de sesiuni, transferăm acest conținut (autentificare și nume complet) într-o matrice:

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;

Îmi cer scuze pentru „mulțimea de cod”, următoarele puncte vor fi mai concise.

2. Folosind aceeași metodă din paragraful anterior, citim rezultatul procesării listei în elementul StringGrid, în timp ce voi da o bucată „semnificativă” de cod:

2.1 Primim lista curentă de sesiuni RDP într-un fișier:

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 Procesați fișierul (sunt indicate doar linii semnificative de cod):

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. Conexiunea directă în sine făcând clic pe linia cu utilizatorul și numărul sesiunii acestuia:

  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. Au mai fost făcute câteva decorațiuni, cum ar fi sortarea făcând clic pe butonul radio și mesaje către utilizator sau tuturor utilizatorilor.

Utilitar pentru conexiunea umbră umană a sesiunilor de utilizatori non-administratori la RDP în WinServer 2012R2

→ Codul sursă complet poate fi văzut aici

III. Folosind AdminLink - ceea ce am văzut:

AdminLink generează o comandă rapidă care face referire la locația utilitarului admilaunch.exe, și o copie personală a utilitarului de lansare AdmiRun.Exe care se află în folderul utilizatorului, de exemplu Vasia, tip C: UsersvasyaWINDOWS. În general, nu totul este atât de rău: vă puteți juca cu drepturi de acces la fișierul de comenzi rapide și altele pentru a vă curăța propria conștiință de administrator.

Sursa: www.habr.com

Cumpărați găzduire de încredere pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără găzduire web fiabilă cu protecție DDoS, servere VPS VDS | ProHoster