Nut vir menslike skadu-verbinding van nie-administrateur na RDP-gebruikersessies in WinServer 2012R2

Die probleem tydens die kwarantyntydperk van die onderneming het die volgende geword: dit is regtig nodig om die aantal besoeke aan kantore deur spesialiste wat diens en konsultasie oor toepassingsagteware bedien, te verminder, en eerlik gesproke misbruik gebruikers dikwels die hulp van spesialiste sonder om in te delf die kwessie self, sê hulle "hulle sal kom - hulle sal help - hulle sal dit doen, maar ek sal rook/koffie drink, ens." Telefoniese konsultasie wanneer jy 'n bediener deel, is meer effektief as jy die afgeleë skerm bekyk.

Nut vir menslike skadu-verbinding van nie-administrateur na RDP-gebruikersessies in WinServer 2012R2

Na die "uitvinding" van ons fiets het verstandige inligting oor die onderwerp van die artikel opgeduik: RDS Shadow – skaduverbinding met RDP-gebruikersessies in Windows Server 2012 R2 of Onbevoorregte gebruiker skadu-modus in Windows-bediener of Delegering van bestuur van HOP-sessies. Almal van hulle behels die gebruik van 'n konsole, selfs met elemente van 'n eenvoudige dialoog.

Alle inligting hieronder is bedoel vir diegene wat verdra abnormale perversies normaalweg om die gewenste resultaat te verkry, deur onnodige metodes uit te vind.
Om nie die kat aan die stert te trek nie, begin ek met die laaste een: die fiets werk vir die gemiddelde gebruiker wat die hulpprogram gebruik AdmiLink, waarvoor te danke aan die skrywer daarvan.

I. Konsole en skadu-HOP.

Sedert gebruik met administrateur regte van die bedienerbestuurder-konsole -> QuickSessionCollection -> deur op die sessie van die gebruiker van belang te klik, kies Shadow in die konteks kieslys vir personeel wat opdrag gee oor hoe om die sagteware te gebruik, nie 'n opsie is nie, is 'n ander "hout" metode oorweeg, naamlik:

1. Vind uit die HOP-ID van die sessie:

query user | findstr Administrator

of:

qwinsta | findstr Administrator 

Verder "| findstr Administrateur“Dit was net gerieflik as jy geweet het presies wat administrateur wat jy nodig het, of gebruik net die eerste deel om almal te sien wat by die bediener aangemeld is.

Nut vir menslike skadu-verbinding van nie-administrateur na RDP-gebruikersessies in WinServer 2012R2

2. Koppel aan hierdie sessie, mits dit in die domein is groepbeleide Die "Stel afstandbeheerreëls op vir gebruikersessies van Remote Desktop Services" opsie is gekies met ten minste die "Monitor sessie met gebruikertoestemming" opsie gekies (meer):

mstsc /shadow:127

Neem asseblief kennis dat die lys slegs gebruikersaanmeldings sal bevat.

Ek herhaal dat jy sonder admin regte die volgende sal kry:

Nut vir menslike skadu-verbinding van nie-administrateur na RDP-gebruikersessies in WinServer 2012R2

Maar vir voorlopige ontfouting van die program wat bespreek sal word, het ek 'n rekening met administrateurregte gebruik.

II. Program

Dus die probleemstelling: die skep van 'n eenvoudige grafiese koppelvlak om met sy toestemming aan die gebruiker se skadu-gevoel te koppel en 'n boodskap aan die gebruiker te stuur. Die programmeeromgewing wat gekies is, is Lazarus.

1. Ons kry die volledige domeinlys van gebruikers "login" - "volle naam" van die administrateur, of weer deur die konsole:

wmic useraccount get Name,FullName 

niemand verbied selfs dit nie:

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

Ek sal dadelik sê dat dit Lazarus was wat 'n probleem gehad het met die verwerking van hierdie lêer, aangesien die enkodering daarvan by verstek UCS-2 is, so ek moes dit net handmatig na gewone UTF-8 omskakel. Daar is baie oortjies in die lêerstruktuur, of eerder baie spasies, wat besluit is om programmaties te verwerk; vroeër of later sal die enkoderingsprobleem opgelos word, en die lêer sal programmaties opgedateer word.

Dus, die idee is om 'n gids toeganklik te hê vir gebruikers van die program, byvoorbeeld c:test, waarin daar 2 lêers sal wees: die eerste met login en volle naam, die tweede met id_rdp en login van gebruikers. Vervolgens verwerk ons ​​hierdie data so goed ons kan :).

In die tussentyd, om te assosieer met die lys van sessies, dra ons hierdie (aanmeld en volle naam) inhoud oor na 'n skikking:

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;

Ek vra om verskoning vir die "baie kode", die volgende punte sal meer bondig wees.

2. Deur dieselfde metode van die vorige paragraaf te gebruik, lees ons die resultaat van die verwerking van die lys in die StringGrid-element, terwyl ek 'n "beduidende" stukkie kode sal gee:

2.1 Ons ontvang die huidige lys van HOP-sessies in 'n lêer:

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 Verwerk die lêer (slegs betekenisvolle reëls kode word aangedui):

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. Direkte verbinding self deur op die lyn met die gebruiker en sy sessienommer te klik:

  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. Nog 'n paar versierings is gemaak, soos sorteer deur op die radioknoppie te klik, en boodskappe aan die gebruiker of alle gebruikers.

Nut vir menslike skadu-verbinding van nie-administrateur na RDP-gebruikersessies in WinServer 2012R2

→ Volledige bronkode kan gesien word hier

III. Gebruik AdminLink - wat ek gesien het:

AdminLink genereer wel 'n kortpad wat na die ligging van die hulpprogram verwys admilaunch.exe, en 'n persoonlike kopie van die bekendstellingshulpmiddel AdmiRun.Exe wat byvoorbeeld in die gebruiker se gids geleë is Vasya, tik C:GebruikersvasyaWINDOWS. Oor die algemeen is alles nie so erg nie: jy kan rondspeel met toegangsregte tot die kortpadlêer en ander om jou eie admin-gewete skoon te maak.

Bron: will.com