Obslužný program pro lidské stínové připojení neadministrátora k uživatelským relacím RDP ve WinServer 2012R2

Problémem v době karantény podniku se stal následující: je skutečně nutné minimalizovat počet návštěv kanceláří specialistů, kteří obsluhují a konzultují aplikační software, a upřímně řečeno, uživatelé často zneužívají pomoc specialistů, aniž by se chtěli ponořit do samotný problém, říkají „přijdou – pomůžou – udělají to, ale já budu kouřit/pít kávu atd.“ Telefonická konzultace při sdílení serveru je efektivnější, pokud se díváte na vzdálenou obrazovku.

Obslužný program pro lidské stínové připojení neadministrátora k uživatelským relacím RDP ve WinServer 2012R2

Po „vynálezu“ našeho kola se objevily rozumné informace na téma článku: RDS Shadow – stínové připojení k uživatelským relacím RDP v systému Windows Server 2012 R2 nebo Neprivilegovaný režim stínu uživatele na serveru Windows nebo Delegování řízení relací RDP. Všechny zahrnují použití konzole, a to i s prvky jednoduchého dialogu.

Všechny níže uvedené informace jsou určeny těm, kteří normálně toleruje abnormální zvrácenosti k dosažení požadovaného výsledku, vymýšlení zbytečných metod.
Abych „netahal kočku za ocas“, začnu tím posledním: kolo funguje pro běžného uživatele pomocí utility AdmiLink, za což patří dík jeho autorovi.

I. Konzolový a stínový RDP.

Od použití s administrátorská práva konzoly Správce serveru -> QuickSessionCollection -> kliknutím na relaci uživatele, který vás zajímá, výběrem možnosti Shadow z kontextové nabídky pro personál poučující, jak software používat, není možnost, byla zvažována jiná „dřevěná“ metoda, a to:

1. Zjistěte ID RDP relace:

query user | findstr Administrator

nebo:

qwinsta | findstr Administrator 

Navíc "| findstr správce„Bylo to pohodlné, jen když jste věděli, co přesně Správce potřebujete, nebo použijte pouze první část, abyste viděli všechny přihlášené k serveru.

Obslužný program pro lidské stínové připojení neadministrátora k uživatelským relacím RDP ve WinServer 2012R2

2. Připojte se k této relaci za předpokladu, že v doméně skupinové zásady Je vybrána možnost „Nastavit pravidla vzdáleného řízení pro uživatelské relace služby Vzdálená plocha“ s vybranou alespoň možností „Monitorovat relaci s oprávněním uživatele“ (více):

mstsc /shadow:127

Upozorňujeme, že seznam bude obsahovat pouze přihlášení uživatelů.

Opakuji, že bez práv správce získáte následující:

Obslužný program pro lidské stínové připojení neadministrátora k uživatelským relacím RDP ve WinServer 2012R2

Ale pro předběžné ladění programu, o kterém bude řeč, jsem použil účet s právy správce.

II. Program

Takže prohlášení o problému: vytvoření nějakého jednoduchého grafického rozhraní pro připojení ke stínovému smyslu uživatele s jeho svolením a odeslání zprávy uživateli. Zvoleným programovacím prostředím je Lazarus.

1. Úplný seznam domén uživatelů „přihlašovací“ – „celé jméno“ získáme od administrátora nebo znovu přes konzoli:

wmic useraccount get Name,FullName 

ani tohle nikdo nezakazuje:

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

Hned řeknu, že to byl Lazarus, kdo měl problém se zpracováním tohoto souboru, protože jeho kódování je standardně UCS-2, takže jsem ho musel ručně převést na běžné UTF-8. Ve struktuře souborů je spousta záložek, respektive mnoho mezer, které bylo rozhodnuto zpracovat programově, dříve nebo později bude problém s kódováním vyřešen a soubor bude programově aktualizován.

Myšlenka je tedy mít složku přístupnou uživatelům programu, například c:test, ve které budou 2 soubory: první s loginem a celým jménem, ​​druhý s id_rdp a přihlášením uživatelů. Dále tato data zpracováváme, jak nejlépe umíme :).

Mezitím, abychom se přidružili k seznamu relací, přeneseme tento obsah (přihlašovací jméno a celé jméno) do pole:

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;

Omlouvám se za „spoustu kódu“, následující body budou stručnější.

2. Stejnou metodou z předchozího odstavce přečteme výsledek zpracování seznamu do prvku StringGrid, přičemž uvedu „významný“ kus kódu:

2.1 Obdržíme aktuální seznam relací RDP v souboru:

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 Zpracujte soubor (jsou uvedeny pouze významné řádky kódu):

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. Samotné přímé připojení kliknutím na řádek s uživatelem a jeho číslem relace:

  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. Bylo vytvořeno několik dalších dekorací, jako je řazení kliknutím na přepínač a zprávy pro uživatele nebo všechny uživatele.

Obslužný program pro lidské stínové připojení neadministrátora k uživatelským relacím RDP ve WinServer 2012R2

→ Lze vidět úplný zdrojový kód zde

III. Použití AdminLink – co jsem viděl:

AdminLink generuje zástupce, který odkazuje na umístění nástroje admilaunch.exea osobní kopii spouštěcího nástroje AdmiRun.Exe který se nachází například ve složce uživatele Vasya, typ C:UsersvasyaWINDOWS. Obecně platí, že ne všechno je tak špatné: můžete si pohrát s přístupovými právy k souboru zástupce a dalšími, abyste si vyčistili svědomí správce.

Zdroj: www.habr.com

Přidat komentář