Verktyg för mänsklig skugganslutning av icke-administratör till RDP-användarsessioner i WinServer 2012R2

Problemet under företagets karantänperiod blev följande: det är verkligen nödvändigt att minimera antalet besök på kontor av specialister som servar och konsulterar applikationsprogram, och ärligt talat missbrukar användare ofta hjälpen från specialister utan att vilja fördjupa sig i själva problemet säger de "de kommer - de kommer att hjälpa - de kommer att göra det, men jag ska röka/dricka kaffe, etc." Telefonkonsultation när du delar en server är effektivare om du tittar på fjärrskärmen.

Verktyg för mänsklig skugganslutning av icke-administratör till RDP-användarsessioner i WinServer 2012R2

Efter "uppfinnandet" av vår cykel dök vettig information om ämnet för artikeln upp: RDS Shadow – skugganslutning till RDP-användarsessioner i Windows Server 2012 R2 eller Oprivilegierad skuggläge för användare i Windows-servern eller Delegera hantering av RDP-sessioner. Alla involverar användningen av en konsol, även med inslag av en enkel dialog.

All information nedan är avsedd för dig som tolererar onormala perversioner normalt för att uppnå önskat resultat, uppfinna onödiga metoder.
För att inte "dra katten i svansen" börjar jag med den sista: cykeln fungerar för den genomsnittliga användaren som använder verktyget AdmiLink, för vilket tack vare dess författare.

I. Konsol och skugga RDP.

Sedan användning med administratörsrättigheter för Server Manager-konsolen -> QuickSessionCollection -> genom att klicka på sessionen för användaren av intresse, välj Shadow från snabbmenyn för personal som instruerar hur programvaran ska användas, inte är ett alternativ, övervägdes en annan "trämetod", nämligen:

1. Ta reda på RDP-id:t för sessionen:

query user | findstr Administrator

eller:

qwinsta | findstr Administrator 

Dessutom"| findstr Administratör"Det var bara bekvämt när man visste exakt vad Administratör du behöver, eller använd bara den första delen för att se alla inloggade på servern.

Verktyg för mänsklig skugganslutning av icke-administratör till RDP-användarsessioner i WinServer 2012R2

2. Anslut till den här sessionen, förutsatt att i domänen grupppolicyer Alternativet "Konfigurera fjärrkontrollregler för användarsessioner för Remote Desktop Services" är valt med åtminstone alternativet "Övervaka session med användarbehörighet" valt (mer):

mstsc /shadow:127

Observera att listan endast kommer att innehålla användarinloggningar.

Jag upprepar att utan administratörsrättigheter får du följande:

Verktyg för mänsklig skugganslutning av icke-administratör till RDP-användarsessioner i WinServer 2012R2

Men för preliminär felsökning av programmet som kommer att diskuteras använde jag ett konto med administratörsrättigheter.

II. Program

Så problemformuleringen: skapa ett enkelt grafiskt gränssnitt för att ansluta till användarens skuggkänsla med hans tillåtelse, skicka ett meddelande till användaren. Den valda programmeringsmiljön är Lazarus.

1. Vi får den fullständiga domänlistan över användare "inloggning" - "fullständigt namn" från administratören, eller igen via konsolen:

wmic useraccount get Name,FullName 

ingen förbjuder ens detta:

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

Jag ska genast säga att det var Lazarus som hade problem med att bearbeta den här filen, eftersom dess kodning som standard är UCS-2, så jag var bara tvungen att manuellt konvertera den till vanlig UTF-8. Det finns många flikar i filstrukturen, eller snarare många utrymmen, som man beslutade att bearbeta programmatiskt, förr eller senare kommer kodningsproblemet att lösas, och filen kommer att uppdateras programmatiskt.

Så, tanken är att ha en mapp tillgänglig för användare av programmet, till exempel c:test, där det kommer att finnas 2 filer: den första med inloggning och fullständigt namn, den andra med id_rdp och inloggning för användare. Därefter behandlar vi dessa uppgifter så gott vi kan :).

Under tiden, för att associera med listan över sessioner, överför vi detta (inloggning och fullständigt namn) innehåll till en array:

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;

Jag ber om ursäkt för "mycket kod", följande punkter kommer att vara mer kortfattade.

2. Med samma metod från föregående stycke läser vi resultatet av att bearbeta listan till StringGrid-elementet, medan jag ger en "signifikant" kodbit:

2.1 Vi får den aktuella listan över 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 Bearbeta filen (endast betydande kodrader anges):

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. Direkt anslutning genom att klicka på raden med användaren och hans 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. Ytterligare ett par dekorationer har gjorts, såsom sortering genom att klicka på radioknappen, och meddelanden till användaren eller alla användare.

Verktyg för mänsklig skugganslutning av icke-administratör till RDP-användarsessioner i WinServer 2012R2

→ Fullständig källkod kan ses här

III. Använder AdminLink - vad jag såg:

AdminLink genererar en genväg som refererar till platsen för verktyget admilaunch.exe, och en personlig kopia av startverktyget AdmiRun.Exe som finns i användarens mapp till exempel Vasya, typ C:UsersvasyaWINDOWS. I allmänhet är inte allt så illa: du kan leka med åtkomsträttigheter till genvägsfilen och andra för att rensa ditt eget administratörssamvete.

Källa: will.com

Lägg en kommentar