Segédprogram a nem adminisztrátor és az RDP-felhasználói munkamenetek emberi árnyékos összekapcsolására a WinServer 2012R2 rendszerben

A probléma a vállalkozás karantén időszakában a következő lett: valóban minimalizálni kell az alkalmazásszoftvereket kiszolgáló és tanácsadással foglalkozó szakemberek irodalátogatását, és őszintén szólva a felhasználók gyakran visszaélnek a szakemberek segítségével anélkül, hogy elmélyülni akarnának. maga a kérdés, azt mondják, hogy "jönnek - segítenek - megcsinálják, de én dohányzom/kávézom stb." A telefonos konzultáció a szerver megosztása esetén hatékonyabb, ha a távoli képernyőt nézi.

Segédprogram a nem adminisztrátor és az RDP-felhasználói munkamenetek emberi árnyékos összekapcsolására a WinServer 2012R2 rendszerben

Kerékpárunk „feltalálása” után a cikk témájában józan információk kerültek elő: RDS Shadow – árnyékkapcsolat az RDP felhasználói munkamenetekhez a Windows Server 2012 R2 rendszerben vagy Kiváltságtalan felhasználói árnyék mód a Windows Serverben vagy Az RDP-munkamenetek kezelésének delegálása. Mindegyikhez tartozik egy konzol használata, még egy egyszerű párbeszéd elemeivel is.

Minden alábbi információ azoknak szól, akik normálisan tűri a kóros perverziókat a kívánt eredmény eléréséhez, szükségtelen módszerek kitalálásával.
Annak érdekében, hogy ne húzzam a macskát a farkánál fogva, az utolsóval kezdem: a kerékpár az átlagos felhasználó számára működik a segédprogram használatával AdmiLink, amiért köszönet szerzőjének.

I. Konzol és árnyék RDP.

Használata óta a Kiszolgálókezelő konzol rendszergazdai jogai -> QuickSessionCollection -> az érdeklődő felhasználó munkamenetére kattintva, a helyi menüben az Árnyék kiválasztásával a szoftver használatát oktató személyzet számára, nem választható, egy másik „fa” módszert is fontolóra vettek, nevezetesen:

1. Keresse meg a munkamenet RDP azonosítóját:

query user | findstr Administrator

vagy:

qwinsta | findstr Administrator 

Ráadásul"| findstr Rendszergazda„Csak akkor volt kényelmes, ha tudtad, hogy pontosan mit adminisztrátor szüksége van rá, vagy csak az első részt használja, ha látni szeretné, hogy mindenki bejelentkezett a szerverre.

Segédprogram a nem adminisztrátor és az RDP-felhasználói munkamenetek emberi árnyékos összekapcsolására a WinServer 2012R2 rendszerben

2. Csatlakozzon ehhez a munkamenethez, feltéve, hogy a tartományban van csoportszabályzat A "Távvezérlési szabályok beállítása a távoli asztali szolgáltatások felhasználói munkameneteihez" opció be van jelölve legalább a "Felhasználói engedéllyel rendelkező munkamenet figyelése" opció bejelölve (több):

mstsc /shadow:127

Felhívjuk figyelmét, hogy a lista csak a felhasználói bejelentkezéseket tartalmazza.

Ismétlem, hogy rendszergazdai jogok nélkül a következőket kapja:

Segédprogram a nem adminisztrátor és az RDP-felhasználói munkamenetek emberi árnyékos összekapcsolására a WinServer 2012R2 rendszerben

De a szóban forgó program előzetes hibakereséséhez egy rendszergazdai jogokkal rendelkező fiókot használtam.

II. Program

Tehát a probléma megfogalmazása: valami egyszerű grafikus felület létrehozása, amellyel a felhasználó engedélyével kapcsolódni lehet a felhasználó árnyékérzetéhez, üzenetet küldeni a felhasználónak. A választott programozási környezet a Lazarus.

1. A „bejelentkezés” - „teljes név” felhasználók teljes domain listáját megkapjuk a rendszergazdától, vagy ismét a konzolon keresztül:

wmic useraccount get Name,FullName 

még ezt sem tiltja senki:

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

Mindjárt leszögezem, hogy a Lazarusnak volt gondja ennek a fájlnak a feldolgozásával, mivel alapértelmezés szerint a kódolása UCS-2, így csak kézzel kellett átalakítanom normál UTF-8-ra. A fájlszerkezetben sok a tabulátor, vagy inkább sok szóköz, amit úgy döntöttek, hogy programozottan dolgozzák fel, előbb-utóbb megoldódik a kódolási probléma, és programozottan frissül a fájl.

Tehát az ötlet az, hogy a program felhasználói számára elérhető legyen egy mappa, például c:test, amelyben 2 fájl lesz: az első a bejelentkezési névvel és a teljes névvel, a második az id_rdp-vel és a felhasználók bejelentkezési adataival. Ezután a lehető legjobban feldolgozzuk ezeket az adatokat :).

Addig is a munkamenetek listájához való társításhoz ezt a tartalmat (bejelentkezés és teljes név) átvisszük egy tömbbe:

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;

Elnézést kérek a „sok kódért”, a következő pontok tömörebbek lesznek.

2. Az előző bekezdésben leírt módszerrel beolvassuk a lista StringGrid elembe történő feldolgozásának eredményét, miközben adok egy „jelentős” kódrészletet:

2.1 Az RDP-munkamenetek aktuális listáját egy fájlban kapjuk meg:

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 A fájl feldolgozása (csak a jelentős kódsorok jelennek meg):

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. Közvetlen kapcsolat létrehozása a felhasználót és a munkamenet számát tartalmazó sorra kattintva:

  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. Készült még pár dekoráció, mint például a választógombra kattintva történő rendezés, illetve a felhasználónak vagy az összes felhasználónak szóló üzenetek.

Segédprogram a nem adminisztrátor és az RDP-felhasználói munkamenetek emberi árnyékos összekapcsolására a WinServer 2012R2 rendszerben

→ A teljes forráskód látható itt

III. Az AdminLink használata – amit láttam:

Az AdminLink létrehoz egy parancsikont, amely hivatkozik a segédprogram helyére admilaunch.exeés az indító segédprogram személyes másolata AdmiRun.Exe amely például a felhasználó mappájában található Vasya, típus C:UsersvasyaWINDOWS. Általánosságban elmondható, hogy nem minden olyan rossz: kijátszhatja a parancsikonfájlhoz és másokhoz való hozzáférési jogokat, hogy megtisztítsa a rendszergazdai lelkiismeretét.

Forrás: will.com

Hozzászólás