Pripomoček za človeško senčno povezavo neskrbnika z uporabniškimi sejami RDP v WinServer 2012R2

Težava v obdobju karantene podjetja je postala naslednja: resnično je treba čim bolj zmanjšati število obiskov pisarn s strani strokovnjakov, ki servisirajo in svetujejo o aplikacijski programski opremi, in odkrito povedano, uporabniki pogosto zlorabljajo pomoč strokovnjakov, ne da bi se želeli poglobiti v samo vprašanje, pravijo "prišli bodo - pomagali bodo - naredili bodo, ampak bom kadil/pil kavo itd." Telefonsko posvetovanje pri skupni rabi strežnika je učinkovitejše, če gledate oddaljeni zaslon.

Pripomoček za človeško senčno povezavo neskrbnika z uporabniškimi sejami RDP v WinServer 2012R2

Po "izumu" našega kolesa so se pojavile zdrave informacije o temi članka: RDS Shadow – senčna povezava z uporabniškimi sejami RDP v sistemu Windows Server 2012 R2 ali Neprivilegiran uporabniški senčni način v strežniku Windows ali Prenos upravljanja sej RDP. Vsi vključujejo uporabo konzole, tudi z elementi preprostega dialoga.

Vse spodnje informacije so namenjene tistim, ki normalno prenaša nenormalne perverzije da bi dosegli želeni rezultat, izumljali nepotrebne metode.
Da ne bom "vlekel mačke za rep", bom začel z zadnjim: kolo deluje za povprečnega uporabnika, ki uporablja pripomoček AdmiLink, za kar gre zahvala njenemu avtorju.

I. Konzola in senčni RDP.

Od uporabe z skrbniške pravice konzole Server Manager -> QuickSessionCollection -> s klikom na sejo uporabnika, ki vas zanima, v kontekstnem meniju izberite Shadow za osebje, ki daje navodila za uporabo programske opreme, ni možnost, upoštevana je bila druga "lesena" metoda, in sicer:

1. Poiščite ID RDP seje:

query user | findstr Administrator

ali:

qwinsta | findstr Administrator 

Poleg tega "| Skrbnik findstr»Priročno je bilo le, ko si vedel, kaj točno skrbnik ki jih potrebujete, ali uporabite samo prvi del, da vidite vse, ki so prijavljeni v strežnik.

Pripomoček za človeško senčno povezavo neskrbnika z uporabniškimi sejami RDP v WinServer 2012R2

2. Povežite se s to sejo, pod pogojem, da v domeni pravilnike skupine Izbrana je možnost »Nastavitev pravil oddaljenega nadzora za uporabniške seje storitev oddaljenega namizja« z izbrano vsaj možnostjo »Nadzor seje z uporabniškim dovoljenjem« (več):

mstsc /shadow:127

Upoštevajte, da bo seznam vseboval samo uporabniške prijave.

Ponavljam, da boste brez skrbniških pravic dobili naslednje:

Pripomoček za človeško senčno povezavo neskrbnika z uporabniškimi sejami RDP v WinServer 2012R2

Toda za predhodno odpravljanje napak v programu, o katerem bomo razpravljali, sem uporabil račun s skrbniškimi pravicami.

II. Program

Torej izjava o problemu: ustvarjanje nekega preprostega grafičnega vmesnika za povezavo z uporabnikovim senzorjem sence z njegovim dovoljenjem, pošiljanje sporočila uporabniku. Izbrano programsko okolje je Lazarus.

1. Celoten seznam domen uporabnikov "prijava" - "polno ime" dobimo od skrbnika ali ponovno prek konzole:

wmic useraccount get Name,FullName 

tudi tega nihče ne prepoveduje:

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

Takoj bom rekel, da je Lazarus imel težave z obdelavo te datoteke, saj je privzeto kodirana UCS-2, zato sem jo moral samo ročno pretvoriti v običajni UTF-8. V strukturi datoteke je veliko zavihkov oziroma veliko presledkov, za katere je bilo odločeno, da jih programsko obdelamo; prej ali slej bo problem kodiranja rešen in datoteka bo programsko posodobljena.

Torej, ideja je imeti mapo, dostopno uporabnikom programa, na primer c:test, v kateri bosta 2 datoteki: prva s prijavo in polnim imenom, druga z id_rdp in prijavo uporabnikov. Nato te podatke obdelamo po svojih najboljših močeh :).

Medtem, da se povežemo s seznamom sej, prenesemo to (prijavno in polno ime) vsebino v polje:

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;

Opravičujem se za "veliko kode", naslednje točke bodo bolj jedrnate.

2. Z isto metodo iz prejšnjega odstavka preberemo rezultat obdelave seznama v element StringGrid, medtem ko bom podal “pomemben” del kode:

2.1 Prejmemo trenutni seznam sej RDP v datoteki:

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 Obdelajte datoteko (navedene so samo pomembne vrstice kode):

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. Sama neposredna povezava s klikom na vrstico z uporabnikom in njegovo številko seje:

  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. Narejenih je bilo še nekaj okraskov, kot je razvrščanje s klikom na izbirni gumb in sporočila uporabniku oziroma vsem uporabnikom.

Pripomoček za človeško senčno povezavo neskrbnika z uporabniškimi sejami RDP v WinServer 2012R2

→ Vidite lahko celotno izvorno kodo tukaj

III. Uporaba AdminLink – kaj sem videl:

AdminLink ustvari bližnjico, ki se sklicuje na lokacijo pripomočka admilaunch.exein osebno kopijo pripomočka za zagon AdmiRun.Exe ki se nahaja v uporabniški mapi npr Vasja, vrsta C:Uporabniki vas WINDOWS. Na splošno ni vse tako slabo: lahko se igrate s pravicami dostopa do datoteke bližnjic in drugih, da si očistite lastno skrbniško vest.

Vir: www.habr.com

Dodaj komentar