Ilo por homa ombra konekto de ne-administranto al RDP-uzantsesioj en WinServer 2012R2

La problemo dum la kvarantena periodo de la entrepreno fariĝis la jena: vere necesas minimumigi la nombron da vizitoj al oficejoj de specialistoj priservaj kaj konsultantaj pri aplikaĵa programaro, kaj sincere, uzantoj ofte misuzas la helpon de specialistoj sen voli enprofundiĝi. la afero mem, ili diras "ili venos - ili helpos - ili faros ĝin, sed mi fumos/trinkos kafon, ktp." Telefona konsulto dum kunhavado de servilo estas pli efika se vi rigardas la foran ekranon.

Ilo por homa ombra konekto de ne-administranto al RDP-uzantsesioj en WinServer 2012R2

Post la "invento" de nia biciklo, aperis prudentaj informoj pri la temo de la artikolo: RDS Shadow - ombra konekto al RDP-uzantsesioj en Windows Server 2012 R2Senprivilegia uzanta ombroreĝimo en Windows ServerDelegi administradon de RDP-sesioj. Ĉiuj ili implikas la uzon de konzolo, eĉ kun elementoj de simpla dialogo.

Ĉiuj informoj malsupre estas destinitaj al tiuj, kiuj normale toleras eksternormajn perversiojn por akiri la deziratan rezulton, inventante nenecesajn metodojn.
Por ne "tiri la katon je la vosto", mi komencos per la lasta: la biciklo funkcias por la meza uzanto uzante la ilon. AdmiLink, pro kio dankon al sia aŭtoro.

I. Konzolo kaj ombro RDP.

Ekde uzo kun administraj rajtoj de la konzolo de Server Manager -> QuickSessionCollection -> alklakante la seancon de la interesata uzanto, elektante Ombron el la kunteksta menuo por personaro instruanta kiel uzi la programaron, ne estas opcio, alia "ligna" metodo estis pripensita, nome:

1. Eltrovu la RDP-id de la sesio:

query user | findstr Administrator

aŭ:

qwinsta | findstr Administrator 

Cetere "| findstr Administranto“Estis oportune nur kiam vi sciis kio precize Administrator vi bezonas, aŭ uzu nur la unuan parton por vidi ĉiujn ensalutitajn al la servilo.

Ilo por homa ombra konekto de ne-administranto al RDP-uzantsesioj en WinServer 2012R2

2. Konektiĝu al ĉi tiu sesio, kondiĉe ke en la domajno gruppolitikoj La opcio "Agordu teleregulojn por uzantkunsidoj de Remote Desktop Services" estas elektita kun almenaŭ la opcio "Monitora sesio kun uzantpermeso" elektita (pli da informoj):

mstsc /shadow:127

Bonvolu noti, ke la listo enhavos nur uzantajn ensalutojn.

Mi ripetas, ke sen administrantoj vi ricevos la jenon:

Ilo por homa ombra konekto de ne-administranto al RDP-uzantsesioj en WinServer 2012R2

Sed por antaŭpurigo de la programo pri kiu estos pridiskutata, mi uzis konton kun administranto-rajtoj.

II. Programo

Do la problemo-deklaro: krei iun simplan grafikan interfacon por konekti al la ombra sento de la uzanto kun lia permeso, sendante mesaĝon al la uzanto. La programa medio elektita estas Lazaro.

1. Ni ricevas la plenan domajnan liston de uzantoj "ensalutu" - "plena nomo" de la administranto, aŭ denove per la konzolo:

wmic useraccount get Name,FullName 

neniu malpermesas eĉ ĉi tion:

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

Mi tuj diros, ke estis Lazaro kiu havis problemon pri prilaborado de ĉi tiu dosiero, ĉar defaŭlte ĝia kodado estas UCS-2, do mi nur devis permane konverti ĝin al regula UTF-8. Estas multaj langetoj en la dosierstrukturo, aŭ pli ĝuste multaj spacoj, kiujn oni decidis prilabori programe; baldaŭ aŭ malfrue la kodoproblemo estos solvita, kaj la dosiero estos ĝisdatigita programe.

Do, la ideo estas havi dosierujon alirebla por uzantoj de la programo, ekzemple c:test, en kiu estos 2 dosieroj: la unua kun salutnomo kaj plennomo, la dua kun id_rdp kaj salutnomo de uzantoj. Poste, ni prilaboras ĉi tiujn datumojn kiel eble plej bone :).

Intertempe, por asocii kun la listo de sesioj, ni transdonas ĉi tiun (ensaluton kaj plenan nomon) enhavon al tabelo:

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 pardonpetas pro la "multo da kodo", la sekvaj punktoj estos pli koncizaj.

2. Uzante la saman metodon de la antaŭa alineo, ni legas la rezulton de prilaborado de la listo en la elementon StringGrid, dum mi donos "signifan" pecon de kodo:

2.1 Ni ricevas la nunan liston de RDP-sesioj en dosiero:

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 Prilaboru la dosieron (nur signifaj kodlinioj estas indikitaj):

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. Rekta konekto mem per klako sur la linio kun la uzanto kaj lia seanca numero:

  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. Kelkaj pliaj ornamaĵoj estis faritaj, kiel ordigo per klako sur la radiobutono, kaj mesaĝoj al la uzanto aŭ ĉiuj uzantoj.

Ilo por homa ombra konekto de ne-administranto al RDP-uzantsesioj en WinServer 2012R2

→ Plena fontkodo videblas tie

III. Uzante AdminLink - kion mi vidis:

AdminLink ja generas ŝparvojon kiu referencas la lokon de la ilo admilaunch.exe, kaj persona kopio de la lanĉa ilo AdmiRun.Exe kiu troviĝas en la dosierujo de la uzanto, ekzemple vasya, tajpu C:UzantojvasyaWINDOWS. Ĝenerale, ne ĉio estas tiel malbona: vi povas ludi kun alirrajtoj al la ŝparvoja dosiero kaj aliaj por purigi vian propran administran konsciencon.

fonto: www.habr.com

Aldoni komenton