Utiliit mitteadministraatorite ja RDP-kasutajate seansside inimseansi ühendamiseks rakenduses WinServer 2012R2

Probleemiks kujunes ettevõtte karantiiniperioodil järgmine: tõesti on vaja minimeerida rakendustarkvara teenindavate ja nõustavate spetsialistide kontorikülastuste arvu ning ausalt öeldes kasutavad kasutajad sageli spetsialistide abi ära, soovimata sellesse süveneda. teema ise, nad ütlevad: "nad tulevad - nad aitavad - nad teevad seda, aga ma suitsetan / joon kohvi jne." Telefonikonsultatsioon serveri jagamisel on tõhusam, kui vaatate kaugekraani.

Utiliit mitteadministraatorite ja RDP-kasutajate seansside inimseansi ühendamiseks rakenduses WinServer 2012R2

Pärast meie jalgratta "leiutamist" ilmus artikli teema kohta mõistlik teave: RDS Shadow – variühendus Windows Server 2012 R2 RDP kasutajaseanssidega või Privilegeeritud kasutaja varjurežiim Windowsi serveris või MAK seansside haldamise delegeerimine. Kõik need hõlmavad konsooli kasutamist, isegi lihtsa dialoogi elementidega.

Kogu allolev teave on mõeldud neile, kes talub ebanormaalseid perversioone normaalselt soovitud tulemuse saavutamiseks, leiutades tarbetuid meetodeid.
Et mitte kassil "sabast tõmmata", alustan viimasest: ratas töötab utiliiti kasutades tavakasutaja jaoks. AdmiLink, mille eest täname selle autorit.

I. Konsool ja vari RDP.

Alates kasutamisest koos serverihalduri konsooli administraatori õigused -> QuickSessionCollection -> klõpsates huvipakkuva kasutaja seansil, valides kontekstimenüüst Shadow personalile, kes juhendab tarkvara kasutamist, ei ole valik, kaaluti teist "puidust" meetodit, nimelt:

1. Uurige seansi RDP ID:

query user | findstr Administrator

või:

qwinsta | findstr Administrator 

Enamgi veel "| findstr Administraator“See oli mugav ainult siis, kui teadsid, mida täpselt administraator mida vajate, või kasutage ainult esimest osa, et näha kõiki, kes on serverisse sisse logitud.

Utiliit mitteadministraatorite ja RDP-kasutajate seansside inimseansi ühendamiseks rakenduses WinServer 2012R2

2. Looge ühendus selle seansiga, eeldusel, et see on domeenis rühmapoliitika Valik "Seadista kaugjuhtimisreeglid kaugtöölauateenuste kasutajaseansside jaoks" on valitud, kui on valitud vähemalt suvand "Jälgi seanssi kasutaja loaga" (rohkem):

mstsc /shadow:127

Pange tähele, et loend sisaldab ainult kasutajate sisselogimisi.

Kordan, et ilma administraatoriõigusteta saate järgmise:

Utiliit mitteadministraatorite ja RDP-kasutajate seansside inimseansi ühendamiseks rakenduses WinServer 2012R2

Kuid käsitletava programmi esialgseks silumiseks kasutasin administraatoriõigustega kontot.

II. Programm

Seega probleemi avaldus: mõne lihtsa graafilise liidese loomine kasutaja varjutajuga ühenduse loomiseks tema loal, kasutajale sõnumi saatmine. Programmeerimiskeskkonnaks on valitud Lazarus.

1. Saame administraatorilt või uuesti konsooli kaudu kasutajate täieliku domeeniloendi "login" - "täisnimi":

wmic useraccount get Name,FullName 

keegi ei keela isegi seda:

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

Ütlen kohe, et selle faili töötlemisega oli probleem Lazarusel, kuna vaikimisi on selle kodeering UCS-2, nii et ma pidin selle lihtsalt käsitsi teisendama tavaliseks UTF-8-ks. Failistruktuuris on palju sakke, õigemini palju tühikuid, mida otsustati programmiliselt töödelda, varem või hiljem kodeeringu probleem laheneb ja faili uuendatakse programmiliselt.

Niisiis, idee on luua programmi kasutajatele juurdepääsetav kaust, näiteks c:test, milles on 2 faili: esimene sisselogimise ja täisnimega, teine ​​id_rdp ja kasutajate sisselogimisega. Järgmiseks töötleme neid andmeid nii hästi kui suudame :).

Vahepeal kanname seansside loendiga seostamiseks selle (sisselogimise ja täisnimi) sisu massiivi:

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;

Vabandan "palju koodi" pärast, järgmised punktid on lakoonilisemad.

2. Kasutades sama meetodit eelmises lõigus, loeme loendi töötlemise tulemuse StringGridi elemendiks, samal ajal kui annan "olulise" koodilõigu:

2.1 Praeguse RDP seansside loendi saame failis:

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 Töötle faili (näidatud on ainult olulised koodiread):

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. Otseühenduse loomine, klõpsates reale kasutaja ja tema seansinumbriga:

  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. Tehtud on veel paar kaunistust, näiteks raadionupule vajutades sorteerimine ja sõnumid kasutajale või kõigile kasutajatele.

Utiliit mitteadministraatorite ja RDP-kasutajate seansside inimseansi ühendamiseks rakenduses WinServer 2012R2

→ Täielik lähtekood on näha siin

III. AdminLinki kasutamine – mida ma nägin:

AdminLink loob otsetee, mis viitab utiliidi asukohale admilaunch.exeja käivitusutiliidi isiklik koopia AdmiRun.Exe mis asub näiteks kasutaja kaustas Vasja, tüüp C:UsersvasyaWINDOWS. Üldiselt pole kõik nii hull: saate oma administraatori südametunnistuse puhastamiseks mängida otseteefaili ja teiste juurdepääsuõigustega.

Allikas: www.habr.com

Lisa kommentaar