Utilitat per a la connexió a l'ombra humana de sessions d'usuari RDP que no són administradors a WinServer 2012R2

El problema durant el període de quarantena de l'empresa es va convertir en el següent: és realment necessari minimitzar el nombre de visites a les oficines d'especialistes que donen servei i assessoren en programari d'aplicacions i, francament, els usuaris sovint abusen de l'ajuda dels especialistes sense voler aprofundir en el tema en si, diuen "vindran, ajudaran, ho faran, però jo fumaré/beuré cafè, etc.". La consulta telefònica en compartir un servidor és més efectiva si visualitzeu la pantalla remota.

Utilitat per a la connexió a l'ombra humana de sessions d'usuari RDP que no són administradors a WinServer 2012R2

Després de la "invenció" de la nostra bicicleta, va aparèixer informació sensata sobre el tema de l'article: RDS Shadow: connexió d'ombra a sessions d'usuari RDP a Windows Server 2012 R2 o Mode d'ombra d'usuari sense privilegis al servidor de Windows o Delegació de gestió de sessions RDP. Totes elles impliquen l'ús d'una consola, fins i tot amb elements d'un diàleg senzill.

Tota la informació a continuació està destinada a aquells que tolera perversions anormals amb normalitat per obtenir el resultat desitjat, inventant mètodes innecessaris.
Per no "tirar el gat per la cua", començaré per l'últim: la bicicleta funciona per a l'usuari mitjà que utilitza la utilitat. AdmiLink, per la qual cosa gràcies al seu autor.

I. Consola i RDP ombra.

Des que s'utilitza amb drets d'administrador de la consola del gestor del servidor -> QuickSessionCollection -> fent clic a la sessió de l'usuari d'interès, seleccionant Shadow al menú contextual per al personal que instrueixi com utilitzar el programari, no és una opció, es va considerar un altre mètode "de fusta", és a dir:

1. Esbrineu l'ID RDP de la sessió:

query user | findstr Administrator

o:

qwinsta | findstr Administrator 

A més "| Findstr Administrador"Només era convenient quan sabia què exactament Administrador necessiteu o utilitzeu només la primera part per veure que tothom ha iniciat sessió al servidor.

Utilitat per a la connexió a l'ombra humana de sessions d'usuari RDP que no són administradors a WinServer 2012R2

2. Connecteu-vos a aquesta sessió, sempre que al domini polítiques de grup L'opció "Configura les regles de control remot per a les sessions de serveis d'escriptori remot de l'usuari" està seleccionada com a mínim amb l'opció "Monitoritza la sessió amb permís d'usuari" seleccionada (més):

mstsc /shadow:127

Tingueu en compte que la llista només contindrà els inicis de sessió dels usuaris.

Repeteixo que sense drets d'administrador obtindreu el següent:

Utilitat per a la connexió a l'ombra humana de sessions d'usuari RDP que no són administradors a WinServer 2012R2

Però per a la depuració preliminar del programa que es tractarà, vaig utilitzar un compte amb drets d'administrador.

II. Programa

Així doncs, la declaració del problema: crear una interfície gràfica senzilla per connectar-se al sentit d'ombra de l'usuari amb el seu permís, enviant un missatge a l'usuari. L'entorn de programació escollit és Lazarus.

1. Obtenim la llista completa de dominis dels usuaris "inici de sessió" - "nom complet" de l'administrador, o de nou a través de la consola:

wmic useraccount get Name,FullName 

ningú prohibeix ni això:

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

De seguida diré que va ser Làzaros qui va tenir un problema amb el processament d'aquest fitxer, ja que per defecte la seva codificació és UCS-2, així que només vaig haver de convertir-lo manualment a UTF-8 normal. Hi ha moltes pestanyes a l'estructura de fitxers, o més aviat molts espais, que es va decidir processar programàticament; tard o d'hora es resoldrà el problema de codificació i el fitxer s'actualitzarà programàticament.

Així doncs, la idea és tenir una carpeta accessible als usuaris del programa, per exemple c:test, en la qual hi haurà 2 fitxers: el primer amb login i nom complet, el segon amb id_rdp i login dels usuaris. A continuació, processem aquestes dades el millor possible :).

Mentrestant, per associar-nos a la llista de sessions, transferim aquest contingut (inici de sessió i nom complet) a una matriu:

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;

Demano disculpes pel "munt de codi", els punts següents seran més concisos.

2. Utilitzant el mateix mètode del paràgraf anterior, llegim el resultat del processament de la llista a l'element StringGrid, mentre que donaré un fragment de codi "significatiu":

2.1 Rebem la llista actual de sessions RDP en un fitxer:

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 Processar el fitxer (només s'indiquen les línies significatives de codi):

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. Connexió directa en si fent clic a la línia amb l'usuari i el seu número de sessió:

  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. S'han fet un parell de decoracions més, com l'ordenació fent clic al botó de ràdio, i missatges a l'usuari o a tots els usuaris.

Utilitat per a la connexió a l'ombra humana de sessions d'usuari RDP que no són administradors a WinServer 2012R2

→ Es pot veure el codi font complet aquí

III. Utilitzant AdminLink - el que vaig veure:

AdminLink genera una drecera que fa referència a la ubicació de la utilitat admilaunch.exe, i una còpia personal de la utilitat de llançament AdmiRun.Exe que es troba a la carpeta de l'usuari, per exemple Vasya, tipus C:UsuarisvasyaWINDOWS. En general, no tot és tan dolent: podeu jugar amb drets d'accés al fitxer de drecera i altres per netejar la vostra consciència d'administrador.

Font: www.habr.com

Afegeix comentari