Утыліта для чалавечага shadow падлучэння неадміна да RDP сесіям карыстальнікаў у WinServer 2012R2

Праблема ў перыяд каранціннай працы прадпрыемства стала наступнай: сапраўды трэба мінімізаваць колькасць наведванняў кабінетаў спецыялістамі, якія абслугоўваюць і кансультуюць па прыкладным ПЗ, ды і сказаць шчыра, карыстальнікі часцяком злоўжываюць дапамогай спецыялістаў не жадаючы ўнікаць у само пытанне, маўляў «прыйдуць - дапамогуць - зробяць, а я пакуль пакуру/пап'ю каву і да т.п.». Кансультацыя па тэлефоне пры сумесным доступе да сервера больш эфектыўна, калі праглядаць выдалены экран.

Утыліта для чалавечага shadow падлучэння неадміна да RDP сесіям карыстальнікаў у WinServer 2012R2

Ужо пасля «вынаходства» нашага ровара падвярнулася разумная інфармацыя на тэму артыкула: RDS Shadow – ценявое падлучэнне да RDP сесіям карыстальнікаў у Windows Server 2012 R2 або Рэжым shadow непрывілеяванага карыстальніка ў windows server або Дэлегуем кіраванне RDP-сеансамі. Усе яны маюць на ўвазе ўжыванне кансолі, нават з элементамі простага дыялогу.

Уся выкладзеная ніжэй інфармацыя прызначана для тых, хто нармальна пераносіць ненармальныя скрыўленні для атрымання патрэбнага выніку, вынаходзячы непатрэбныя спосабы.
Каб "не цягнуць ката за хвост", пачну з апошняга: ровар працуе ў звычайнага карыстальніка з дапамогай утыліты AdmiLink, за што яе аўтару і дзякуй.

I. Кансоль і shadow RDP.

Так як выкарыстанне з адмінскімі правамі кансолі Server Manager -> QuickSessionCollection -> пстрыкнуўшы па сесіі які цікавіць карыстача, абраўшы ў кантэкстным меню Shadow (Ценевая копія) для персанала, які інструктуе па працы з ПЗ, - не варыянт, быў разгледжаны іншы «драўляны» спосаб, а менавіта:

1. Даведаемся RDP id сесіі:

query user | findstr Administrator

ці:

qwinsta | findstr Administrator 

Прычым "| findstr Administratorбыло зручна толькі калі ты ведаеш, што менавіта адміністратар табе патрэбен, або выкарыстоўваць толькі першую частку для бачання ўсіх залагініліся на серверы.

Утыліта для чалавечага shadow падлучэння неадміна да RDP сесіям карыстальнікаў у WinServer 2012R2

2. Падключаемся да гэтай сесіі, пры ўмове што ў даменных групавых палітыках параметр «Усталёўвае правілы выдаленага кіравання для карыстацкіх сеансаў службаў выдаленых працоўных сталоў» абраны параметр як мінімум «Назіранне за сеансам з дазволу карыстальніка» (больш падрабязна):

mstsc /shadow:127

Прашу звярнуць увагу, што ў спісе будуць толькі лагіны карыстальнікаў.

Паўтаруся, што без адмінскіх правоў вы атрымаеце наступнае:

Утыліта для чалавечага shadow падлучэння неадміна да RDP сесіям карыстальнікаў у WinServer 2012R2

Але для папярэдняй адладкі праграмы, аб якой пайдзе прамову, я выкарыстаў улік з правамі адміністратара.

II. Праграма

Такім чынам пастаноўка задачы: стварэнне няма каго простага графічнага інтэрфейсу для падлучэння да ценявага сэнсу карыстача з яго дазволу, адпраўка паведамлення карыстачу. Асяроддзе праграмавання абрана Lazarus.

1. Атрымліваем поўны даменны спіс карыстальнікаў «лагін» — «поўнае імя» ў адміна, альбо зноў-такі праз кансоль:

wmic useraccount get Name,FullName 

ніхто не забараняе нават так:

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

Скажу адразу, што менавіта ў Lazarus аказалася праблема з апрацоўкай гэтага файла, бо па змаўчанні яго кадоўка UCS-2, таму прыйшлося проста пераўтварыць уручную ў звычайны UTF-8. У структуры файла шмат табуляцый, дакладней мноства прабелаў, якія было вырашана ўсё ж праграмна апрацаваць, рана ці позна задача з кадоўкай будзе вырашана, і файл будзе праграмна абнаўляцца.

Такім чынам, у задумцы тэчка, даступная для карыстачоў праграмы, напрыклад c:test, у якой будзе 2 файла: першы з login і fullname, другі з id_rdp і login карыстачоў. Далей гэтыя дадзеныя апрацоўваем як можам:).

А пакуль для асацыявання са спісам сесій пераносім гэта (login і fullname) змесціва ў масіў:

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;

Прашу прабачэнні за «шмат кода», наступныя пункты будуць больш лаканічныя.

2. Аналагічна метадам з папярэдняга пункта счытваем вынік апрацоўкі спісу ў элемент StringGrid, пры гэтым прывяду "значны" кавалак кода:

2.1 Атрымліваем актуальны спіс RDP сесій у файл:

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 Апрацоўваем файл (пазначаны толькі значныя радкі кода):

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. Непасрэдна само падлучэнне пры кліку на радок з карыстальнікам і нумарам яго сеанса:

  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. Зроблена яшчэ пару упрыгожвальніцтваў тыпу сартавання па зграі на radiobutton, і паведамленні карыстачу, альбо ўсім карыстачам.

Утыліта для чалавечага shadow падлучэння неадміна да RDP сесіям карыстальнікаў у WinServer 2012R2

→ Поўны зыходны код можна ўбачыць тут

III. Ужыванне AdminLink - што я ўбачыў:

AdminLink сапраўды генеруе ярлык, у якім спасылаецца на размяшчэнне ўтыліты admilaunch.exe, і асабістай копіяй утыліты запуску AdmiRun.Exe якая знаходзіцца ў тэчцы карыстальніка, напрыклад vasya, па тыпу C:UsersvasyaWINDOWS. Увогуле, не ўсё так дрэнна: з правамі доступу да файла цэтліка і іншымі, для ачышчэння ўласнага адмінскага сумлення, можна пагуляцца.

Крыніца: habr.com

Дадаць каментар