Verktøy for menneskelig skyggetilkobling av ikke-administrator til RDP-brukerøkter i WinServer 2012R2

Problemet under karanteneperioden til bedriften ble følgende: det er virkelig nødvendig å minimere antall besøk til kontorer av spesialister som betjener og rådgiver om applikasjonsprogramvare, og ærlig talt, brukere ofte misbruker hjelpen fra spesialister uten å ønske å fordype seg i selve problemet sier de "de vil komme - de vil hjelpe - de vil gjøre det, men jeg skal røyke/drikke kaffe osv." Telefonkonsultasjon når du deler en server er mer effektivt hvis du ser på den eksterne skjermen.

Verktøy for menneskelig skyggetilkobling av ikke-administrator til RDP-brukerøkter i WinServer 2012R2

Etter "oppfinnelsen" av sykkelen vår dukket det opp fornuftig informasjon om emnet for artikkelen: RDS Shadow – skyggetilkobling til RDP-brukerøkter i Windows Server 2012 R2 eller Uprivilegert brukerskyggemodus i Windows-serveren eller Delegere ledelse av RDP-sesjoner. Alle involverer bruk av en konsoll, selv med elementer av en enkel dialog.

All informasjon nedenfor er beregnet på de som tolererer unormale perversjoner normalt for å oppnå ønsket resultat ved å finne opp unødvendige metoder.
For ikke å "dra katten i halen", begynner jeg med den siste: sykkelen fungerer for den gjennomsnittlige brukeren som bruker verktøyet AdmiLink, som takket være forfatteren.

I. Konsoll og skygge RDP.

Siden bruk med administratorrettigheter for Server Manager-konsollen -> QuickSessionCollection -> ved å klikke på økten til brukeren av interesse, velge Shadow fra kontekstmenyen for personell som instruerer hvordan programvaren skal brukes, ikke er et alternativ, ble en annen "tre" metode vurdert, nemlig:

1. Finn ut RDP-ID-en for økten:

query user | findstr Administrator

eller:

qwinsta | findstr Administrator 

Dessuten "| findstr Administrator"Det var bare praktisk når du visste nøyaktig hva administrator du trenger, eller bruk kun den første delen for å se alle som er logget på serveren.

Verktøy for menneskelig skyggetilkobling av ikke-administrator til RDP-brukerøkter i WinServer 2012R2

2. Koble til denne økten, forutsatt at i domenet gruppepolicyer Alternativet "Sett opp fjernkontrollregler for brukersesjoner for Remote Desktop Services" er valgt med minst alternativet "Overvåk økt med brukertillatelse" valgt (mer):

mstsc /shadow:127

Vær oppmerksom på at listen kun vil inneholde brukerpålogginger.

Jeg gjentar at uten administratorrettigheter vil du få følgende:

Verktøy for menneskelig skyggetilkobling av ikke-administrator til RDP-brukerøkter i WinServer 2012R2

Men for foreløpig feilsøking av programmet som vil bli diskutert, brukte jeg en konto med administratorrettigheter.

II. Program

Så problemformuleringen: å lage et enkelt grafisk grensesnitt for å koble til brukerens skyggesans med hans tillatelse, og sende en melding til brukeren. Programmeringsmiljøet som er valgt er Lazarus.

1. Vi får den fullstendige domenelisten over brukere "pålogging" - "fullt navn" fra administratoren, eller igjen gjennom konsollen:

wmic useraccount get Name,FullName 

ingen forbyr selv dette:

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

Jeg vil si med en gang at det var Lazarus som hadde et problem med å behandle denne filen, siden kodingen som standard er UCS-2, så jeg måtte bare manuelt konvertere den til vanlig UTF-8. Det er mange faner i filstrukturen, eller rettere sagt mange mellomrom, som det ble besluttet å behandle programmatisk; før eller siden vil kodingsproblemet bli løst, og filen vil bli oppdatert programmatisk.

Så, ideen er å ha en mappe tilgjengelig for brukere av programmet, for eksempel c:test, der det vil være 2 filer: den første med pålogging og fullt navn, den andre med id_rdp og pålogging av brukere. Deretter behandler vi disse dataene så godt vi kan :).

I mellomtiden, for å knytte til listen over økter, overfører vi dette (pålogging og fullt navn) innhold til en matrise:

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;

Jeg beklager "massen med kode", de følgende punktene vil være mer konsise.

2. Ved å bruke samme metode fra forrige avsnitt, leser vi resultatet av å behandle listen til StringGrid-elementet, mens jeg vil gi en "betydelig" kodebit:

2.1 Vi mottar gjeldende liste over RDP-økter i en fil:

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 Behandle filen (kun signifikante kodelinjer er angitt):

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 tilkobling ved å klikke på linjen med brukeren og hans øktnummer:

  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. Det er laget et par dekorasjoner til, som sortering ved å klikke på radioknappen, og meldinger til brukeren eller alle brukere.

Verktøy for menneskelig skyggetilkobling av ikke-administrator til RDP-brukerøkter i WinServer 2012R2

→ Full kildekode kan sees her

III. Bruke AdminLink - det jeg så:

AdminLink genererer en snarvei som refererer til plasseringen av verktøyet admilaunch.exe, og en personlig kopi av lanseringsverktøyet AdmiRun.Exe som ligger i brukerens mappe, for eksempel Vasja, type C:UsersvasyaWINDOWS. Generelt er ikke alt så ille: du kan leke med tilgangsrettigheter til snarveifilen og andre for å tømme din egen administratorsamvittighet.

Kilde: www.habr.com

Legg til en kommentar