Værktøj til menneskelig skyggeforbindelse af ikke-administrator til RDP-brugersessioner i WinServer 2012R2

Problemet i virksomhedens karantæneperiode blev følgende: det er virkelig nødvendigt at minimere antallet af besøg på kontorer af specialister, der servicerer og rådgiver om applikationssoftware, og ærligt talt misbruger brugere ofte hjælpen fra specialister uden at ville dykke ned i selve problemet siger de "de kommer - de vil hjælpe - de vil gøre det, men jeg ryger/drikker kaffe osv." Telefonkonsultation, når du deler en server, er mere effektiv, hvis du ser fjernskærmen.

Værktøj til menneskelig skyggeforbindelse af ikke-administrator til RDP-brugersessioner i WinServer 2012R2

Efter "opfindelsen" af vores cykel dukkede fornuftige oplysninger op om emnet for artiklen: RDS Shadow – skyggeforbindelse til RDP-brugersessioner i Windows Server 2012 R2 eller Uprivilegeret bruger skyggetilstand i Windows server eller Uddelegering af ledelse af RDP-sessioner. Alle involverer brugen af ​​en konsol, selv med elementer af en simpel dialog.

Al information nedenfor er beregnet til dem, der tolererer unormale perversioner normalt for at opnå det ønskede resultat ved at opfinde unødvendige metoder.
For ikke at "trække katten i halen", vil jeg starte med den sidste: cyklen fungerer for den gennemsnitlige bruger, der bruger værktøjet AdmiLink, som takket være forfatteren.

I. Konsol og skygge RDP.

Siden brug med administratorrettigheder for Server Manager-konsollen -> QuickSessionCollection -> ved at klikke på sessionen for brugeren af ​​interesse, vælge Shadow fra kontekstmenuen for personale, der instruerer, hvordan softwaren skal bruges, er ikke en mulighed, blev en anden "træ" metode overvejet, nemlig:

1. Find ud af sessionens RDP-id:

query user | findstr Administrator

eller:

qwinsta | findstr Administrator 

I øvrigt "| findstr Administrator"Det var kun praktisk, når man vidste præcis hvad Administrator du har brug for, eller brug kun den første del for at se alle, der er logget ind på serveren.

Værktøj til menneskelig skyggeforbindelse af ikke-administrator til RDP-brugersessioner i WinServer 2012R2

2. Opret forbindelse til denne session, forudsat at i domænet gruppepolitikker Indstillingen "Konfigurer fjernbetjeningsregler for brugersessioner af Remote Desktop Services" er valgt med mindst indstillingen "Overvåg session med brugertilladelse" valgt (mere):

mstsc /shadow:127

Bemærk venligst, at listen kun vil indeholde brugerlogins.

Jeg gentager, at uden administratorrettigheder får du følgende:

Værktøj til menneskelig skyggeforbindelse af ikke-administrator til RDP-brugersessioner i WinServer 2012R2

Men til foreløbig fejlfinding af programmet, der vil blive diskuteret, brugte jeg en konto med administratorrettigheder.

II. Program

Så problemformuleringen: at skabe en simpel grafisk grænseflade for at forbinde til brugerens skyggesans med hans tilladelse, og sende en besked til brugeren. Det valgte programmeringsmiljø er Lazarus.

1. Vi får den fulde domæneliste over brugere "login" - "fulde navn" fra administratoren eller igen gennem konsollen:

wmic useraccount get Name,FullName 

ingen forbyder selv dette:

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

Jeg vil med det samme sige, at det var Lazarus, der havde et problem med at behandle denne fil, da dens kodning som standard er UCS-2, så jeg måtte bare manuelt konvertere den til almindelig UTF-8. Der er mange faner i filstrukturen, eller rettere en masse mellemrum, som det blev besluttet at behandle programmatisk; før eller siden vil kodningsproblemet blive løst, og filen vil blive opdateret programmatisk.

Så ideen er at have en mappe tilgængelig for brugere af programmet, for eksempel c:test, hvori der vil være 2 filer: den første med login og fuldt navn, den anden med id_rdp og login for brugere. Dernæst behandler vi disse data så godt vi kan :).

I mellemtiden overfører vi dette (login og fuldt navn) indhold til et array for at associere med listen over sessioner:

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 undskylder for "massen af ​​kode", de følgende punkter vil være mere kortfattede.

2. Ved at bruge samme metode fra forrige afsnit læser vi resultatet af at behandle listen til StringGrid-elementet, mens jeg vil give et "betydeligt" stykke kode:

2.1 Vi modtager den aktuelle liste over RDP-sessioner 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 Behandl filen (kun væsentlige kodelinjer er angivet):

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 selve forbindelsen ved at klikke på linjen med brugeren og dennes sessionsnummer:

  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. Der er lavet et par dekorationer mere, såsom sortering ved at klikke på radioknappen og beskeder til brugeren eller alle brugere.

Værktøj til menneskelig skyggeforbindelse af ikke-administrator til RDP-brugersessioner i WinServer 2012R2

→ Fuld kildekode kan ses her

III. Brug af AdminLink - hvad jeg så:

AdminLink genererer en genvej, der refererer til placeringen af ​​hjælpeprogrammet admilaunch.exe, og en personlig kopi af startværktøjet AdmiRun.Exe som f.eks. ligger i brugerens mappe Vasya, type C:UsersvasyaWINDOWS. Generelt er ikke alt så slemt: du kan lege med adgangsrettigheder til genvejsfilen og andre for at rense din egen administrators samvittighed.

Kilde: www.habr.com

Tilføj en kommentar