Uslužni program za ljudsku sjenčanu vezu neadministratorskih sa RDP korisničkim sesijama u WinServeru 2012R2

Problem tokom karantenskog perioda preduzeća postao je sledeći: zaista je potrebno svesti na minimum broj poseta kancelarijama od strane stručnjaka koji servisiraju i konsultuju aplikativni softver, a iskreno govoreći, korisnici često zloupotrebljavaju pomoć stručnjaka ne želeći da se upuštaju u u samom pitanju, kažu “doći će – pomoći će – uradiće to, ali ja ću pušiti/popiti kafu, itd.” Telefonske konsultacije prilikom dijeljenja servera su efikasnije ako gledate udaljeni ekran.

Uslužni program za ljudsku sjenčanu vezu neadministratorskih sa RDP korisničkim sesijama u WinServeru 2012R2

Nakon "izumljenja" našeg bicikla, pojavile su se zdrave informacije o temi članka: RDS Shadow – sjena veza sa RDP korisničkim sesijama u Windows Serveru 2012 R2 ili Način sjene neprivilegiranih korisnika u Windows serveru ili Delegiranje upravljanja sesijama RDP-a. Svi oni uključuju upotrebu konzole, čak i sa elementima jednostavnog dijaloga.

Sve informacije u nastavku namijenjene su onima koji normalno toleriše abnormalne perverzije za postizanje željenog rezultata, izmišljanjem nepotrebnih metoda.
Kako ne bih "vukao mačku za rep", počet ću s posljednjim: bicikl radi za prosječnog korisnika koristeći uslužni program AdmiLink, na čemu se zahvaljujemo njenom autoru.

I. Konzola i RDP u sjeni.

Od upotrebe sa administratorska prava konzole Server Manager -> QuickSessionCollection -> klikom na sesiju korisnika od interesa, odabirom Shadow iz kontekstnog menija za osoblje koje podučava kako koristiti softver, nije opcija, razmatrana je druga „drvena“ metoda, i to:

1. Saznajte RDP ID sesije:

query user | findstr Administrator

ili:

qwinsta | findstr Administrator 

Štaviše "| findstr Administrator„Bilo je zgodno samo kada se zna šta tačno Administrator trebate ili koristite samo prvi dio da vidite sve koji su prijavljeni na server.

Uslužni program za ljudsku sjenčanu vezu neadministratorskih sa RDP korisničkim sesijama u WinServeru 2012R2

2. Povežite se na ovu sesiju, pod uvjetom da je u domeni grupne politike Odabrana je opcija "Postavi pravila daljinske kontrole za korisničke sesije usluga udaljene radne površine" uz odabranu opciju "Nadgledanje sesije s korisničkom dozvolom" (više informacija):

mstsc /shadow:127

Imajte na umu da će lista sadržavati samo korisničke prijave.

Ponavljam da ćete bez administratorskih prava dobiti sljedeće:

Uslužni program za ljudsku sjenčanu vezu neadministratorskih sa RDP korisničkim sesijama u WinServeru 2012R2

Ali za preliminarno otklanjanje grešaka u programu o kojem će biti reči, koristio sam nalog sa administratorskim pravima.

II. Program

Dakle, izjava o problemu: kreiranje nekog jednostavnog grafičkog interfejsa za povezivanje sa korisnikovim čulom senke uz njegovu dozvolu, slanje poruke korisniku. Izabrano programsko okruženje je Lazarus.

1. Kompletnu listu domena korisnika "login" - "puno ime" dobijamo od administratora, ili opet preko konzole:

wmic useraccount get Name,FullName 

niko ne zabranjuje ni ovo:

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

Odmah ću reći da je Lazarus imao problem sa obradom ovog fajla, pošto je po defaultu njegovo kodiranje UCS-2, tako da sam samo morao ručno da ga konvertujem u običan UTF-8. Postoji mnogo kartica u strukturi datoteke, odnosno puno prostora, koje je odlučeno programski obraditi prije ili kasnije problem kodiranja će biti riješen, a datoteka će se programski ažurirati.

Dakle, ideja je da korisnicima programa bude dostupan folder, na primjer c:test, u kojem će biti 2 fajla: prvi sa login i punim imenom, drugi sa id_rdp i login korisnika. Zatim ove podatke obrađujemo najbolje što možemo :).

U međuvremenu, da bismo se povezali sa listom sesija, ovaj sadržaj (prijava i puno ime) prenosimo u niz:

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;

Izvinjavam se zbog "puno koda", sljedeće točke će biti sažetije.

2. Koristeći istu metodu iz prethodnog pasusa, čitamo rezultat obrade liste u StringGrid element, dok ću dati „značajan“ dio koda:

2.1 Primamo trenutnu listu RDP sesija u datoteci:

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 Obradite datoteku (naznačeni su samo značajni redovi koda):

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 direktna konekcija klikom na liniju sa korisnikom i njegovim brojem sesije:

  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. Urađeno je još par ukrasa, kao što je sortiranje klikom na radio dugme i poruke korisniku ili svim korisnicima.

Uslužni program za ljudsku sjenčanu vezu neadministratorskih sa RDP korisničkim sesijama u WinServeru 2012R2

→ Može se vidjeti cijeli izvorni kod ovdje

III. Koristeći AdminLink - ono što sam vidio:

AdminLink generiše prečicu koja upućuje na lokaciju uslužnog programa admilaunch.exe, i ličnu kopiju uslužnog programa za pokretanje AdmiRun.Exe koji se nalazi u folderu korisnika, na primjer Vasya, po vrsti C:UsersvasyaWINDOWS. Općenito, nije sve tako loše: možete se poigrati s pravima pristupa fajlu prečice i drugim da biste očistili vlastitu savjest administratora.

izvor: www.habr.com