Utilità per la connessione shadow umana di utenti non amministratori alle sessioni utente RDP in WinServer 2012R2

Il problema durante il periodo di quarantena dell'azienda è diventato il seguente: è davvero necessario ridurre al minimo il numero di visite agli uffici da parte di specialisti che prestano assistenza e consulenza sul software applicativo e, francamente, gli utenti spesso abusano dell'aiuto degli specialisti senza voler approfondire il problema in sé, dicono "verranno - aiuteranno - lo faranno, ma io fumerò/berrò caffè, ecc." La consultazione telefonica durante la condivisione di un server è più efficace se si visualizza lo schermo remoto.

Utilità per la connessione shadow umana di utenti non amministratori alle sessioni utente RDP in WinServer 2012R2

Dopo "l'invenzione" della nostra bicicletta, sono emerse informazioni sensate sull'argomento dell'articolo: RDS Shadow: connessione shadow alle sessioni utente RDP in Windows Server 2012 R2 o Modalità shadow utente non privilegiato in Windows Server o Gestione delegata delle sessioni RDP. Tutti prevedono l'uso di una console, anche con elementi di un semplice dialogo.

Tutte le informazioni di seguito sono destinate a coloro che tollera normalmente le perversioni anomale per ottenere il risultato desiderato, inventando metodi inutili.
Per non “tirare il gatto per la coda”, comincio dall’ultimo: la bici funziona per l’utente medio utilizzando l’utility AdmiLink, per il quale si ringrazia il suo autore.

I. Console e RDP ombra.

Dall'uso con diritti di amministratore della console di Server Manager -> QuickSessionCollection -> cliccando sulla sessione dell'utente di interesse, selezionando Shadow dal menu contestuale per il personale che istruisce l'uso del software, non è un'opzione, è stato considerato un altro metodo “in legno”, vale a dire:

1. Scopri l'ID RDP della sessione:

query user | findstr Administrator

oppure:

qwinsta | findstr Administrator 

Inoltre "| amministratore findstr"Era conveniente solo quando sapevi esattamente cosa Amministratore di cui hai bisogno, oppure usa solo la prima parte per vedere tutti coloro che hanno effettuato l'accesso al server.

Utilità per la connessione shadow umana di utenti non amministratori alle sessioni utente RDP in WinServer 2012R2

2. Connettersi a questa sessione, purché nel dominio politiche di gruppo L'opzione "Imposta regole di controllo remoto per le sessioni utente di Servizi Desktop remoto" è selezionata con almeno l'opzione "Monitora sessione con autorizzazione utente" selezionata (più):

mstsc /shadow:127

Tieni presente che l'elenco conterrà solo gli accessi degli utenti.

Ribadisco che senza diritti di amministratore otterrai quanto segue:

Utilità per la connessione shadow umana di utenti non amministratori alle sessioni utente RDP in WinServer 2012R2

Ma per il debug preliminare del programma di cui parleremo, ho utilizzato un account con diritti di amministratore.

II. Programma

Quindi l’affermazione del problema: creare una semplice interfaccia grafica per connettersi al senso dell’ombra dell’utente con il suo permesso, inviando un messaggio all’utente. L'ambiente di programmazione scelto è Lazarus.

1. Otteniamo l'elenco completo dei domini degli utenti “login” - “nome completo” dall'amministratore o ancora tramite la console:

wmic useraccount get Name,FullName 

nessuno vieta nemmeno questo:

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

Dirò subito che è stato Lazarus ad avere un problema con l'elaborazione di questo file, poiché per impostazione predefinita la sua codifica è UCS-2, quindi ho dovuto solo convertirlo manualmente in UTF-8 normale. Ci sono molte schede nella struttura del file, o meglio molti spazi, che si è deciso di elaborare a livello di programmazione, prima o poi il problema della codifica verrà risolto e il file verrà aggiornato a livello di programmazione.

Quindi l'idea è quella di avere una cartella accessibile agli utenti del programma, ad esempio c:test, in cui ci saranno 2 file: il primo con login e nome completo, il secondo con id_rdp e login degli utenti. Successivamente, elaboriamo questi dati nel miglior modo possibile :).

Nel frattempo, per associarci alla lista delle sessioni, trasferiamo questo contenuto (login e fullname) in un 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;

Mi scuso per il “lotto di codice”, i punti successivi saranno più concisi.

2. Utilizzando lo stesso metodo del paragrafo precedente, leggiamo il risultato dell'elaborazione della lista nell'elemento StringGrid, mentre fornirò una parte di codice “significativa”:

2.1 Riceviamo l'elenco corrente delle sessioni RDP in un file:

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 Elaborare il file (sono indicate solo le righe di codice significative):

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. Connessione diretta stessa cliccando sulla riga con l'utente e il suo numero di sessione:

  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. Sono state aggiunte un paio di decorazioni in più, come l'ordinamento tramite clic sul pulsante di opzione e i messaggi all'utente o a tutti gli utenti.

Utilità per la connessione shadow umana di utenti non amministratori alle sessioni utente RDP in WinServer 2012R2

→ È possibile visualizzare il codice sorgente completo qui

III. Utilizzando AdminLink: cosa ho visto:

AdminLink genera un collegamento che fa riferimento alla posizione dell'utilità admilaunch.exee una copia personale dell'utilità di lancio AdmiRun.Exe che si trova ad esempio nella cartella dell'utente Vasya, genere C: UtentivasyaWINDOWS. In generale, non tutto è così male: puoi giocare con i diritti di accesso al file di collegamento e ad altri per schiarirti la coscienza di amministratore.

Fonte: habr.com

Aggiungi un commento