Strumento per il collegamento shadow di un utente non admin a sessioni RDP in WinServer 2012R2

Durante il periodo di quarantena, l'azienda ha affrontato il seguente problema: era davvero necessario ridurre al minimo il numero di visite degli specialisti che assistono e forniscono consulenze su software applicativo. Francamente, gli utenti tendono spesso ad abusare dell'aiuto degli specialisti, preferendo dire "arriveranno, ci aiuteranno, faranno il lavoro, io intanto fumo o bevo un caffè". La consulenza telefonica con accesso condiviso al server è più efficace se si visualizza lo schermo remoto.

Strumento per il collegamento shadow di un utente non admin a sessioni RDP in WinServer 2012R2

Subito dopo "l'invenzione" della nostra bicicletta, è emersa un'informazione rilevante riguardo all'articolo: RDS Shadow – connessione shadow alle sessioni RDP degli utenti in Windows Server 2012 R2 o Modalità shadow per utenti non privilegiati in Windows Server o Delega la gestione delle sessioni RDP. Tutti si riferiscono all'uso della console, anche con elementi di semplice dialogo.

Tutte le informazioni sotto riportate sono destinate a coloro che tollerano normalmente le deviazioni anomale per ottenere il risultato desiderato, inventando metodi non necessari.
Per "non tirarla per le lunghe", comincerò dall'ultimo: la bicicletta funziona per l'utente normale tramite l'utility AdmiLink, per la quale ringraziamo il suo autore.

I. Console e shadow RDP.

Poiché l'uso della console Server Manager con diritti di amministrazione -> QuickSessionCollection -> cliccando sulla sessione dell'utente interessato e selezionando nel menu contestuale Shadow (Copia Ombra) per il personale che fornisce istruzioni sull'uso del software, — non è un'opzione, è stato considerato un altro metodo “rustico”, ovvero:

1. Scopriamo l'ID RDP della sessione:

query user | findstr Administrator

oppure:

qwinsta | findstr Administrator 

Infatti, "| findstr Administrator" era utile solo quando sai esattamente cosa Amministratore ti serve, oppure usare solo la prima parte per vedere tutti gli utenti loggati sul server.

Strumento per il collegamento shadow di un utente non admin a sessioni RDP in WinServer 2012R2

2. Ci connettiamo a questa sessione, a condizione che nelle politiche di gruppo del dominio l'impostazione "Stabilisce le regole per la gestione remota delle sessioni utente dei servizi Desktop Remoto" sia selezionata su almeno "Osservazione della sessione con autorizzazione dell'utente" (maggiori dettagli):

mstsc /shadow:127

Si prega di notare che nella lista saranno mostrati solo i login degli utenti.

Ripeto che senza diritti di amministrazione otterrete quanto segue:

Strumento per il collegamento shadow di un utente non admin a sessioni RDP in WinServer 2012R2

Ma per il debug preliminare del programma di cui si parlerà, ho utilizzato un'utenza con diritti di amministratore.

II. Programma

Quindi, l'obiettivo è: creare una sorta di interfaccia grafica semplice per collegarsi al senso shadow dell'utente con il suo permesso e inviare un messaggio all'utente. L'ambiente di programmazione scelto è Lazarus.

1. Otteniamo l'elenco completo degli utenti di dominio "login" – "nome completo" dall'amministratore, oppure, ancora una volta, tramite la console:

wmic useraccount get Name,FullName 

nessuno vieta nemmeno di farlo in questo modo:

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

Dico subito che con Lazarus si è presentato un problema nell'elaborazione di questo file, in quanto la sua codifica predefinita è UCS-2, quindi è stato necessario convertirlo manualmente in UTF-8 normale. Nella struttura del file ci sono molte tabulazioni, o meglio, molti spazi, che si è deciso di elaborare programmaticamente; prima o poi il problema della codifica sarà risolto, e il file sarà aggiornato programmaticamente.

Quindi, l'idea è 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. In seguito, elaboriamo questi dati come possiamo:).

E nel frattempo, per associare con l'elenco delle sessioni, trasferiamo il contenuto di questi (login e nome completo) in un array:

procedure Tf_rdp.UserF2Array;
var 
  F:TextFile;   i:integer;   f1, line1:String;   fL: TStringList;
begin //f_d percorso globale per la posizione dei file 
f1:=f_d+'user_name.txt';     //il compito è leggere il contenuto del file nell'array
fL := TStringList.Create; // la stringa sarà sottoposta a metamorfosi con delimitatori
fL.Delimiter := '|'; fL.StrictDelimiter := True;
AssignFile(F,f1); 
try // Apri il file per la lettura
  reset(F); ReadLn(F,line1);
  i:=0;
while not eof(F) do // Leggiamo righe fino alla fine del file
begin
ReadLn(F,line1);
line1:= StringReplace(line1, '  ', '|',[]); //sostituiamo il primo incontro di 2 spazi con il delimitatore |
// rimuoviamo tutti i doppi spazi
while pos('  ',line1)>0 do line1:= StringReplace(line1, '  ', ' ', [rfReplaceAll]);
begin
if (pos('|',line1)>0) then
begin //se esiste il delimitatore, lo inseriamo nell'array
fL.DelimitedText :=line1; // dividiamo in colonne
if (fL[0]'') then //se l'account ha un nome
begin // inseriamo nell'array
 inc(i); // eliminiamo spazi singoli nel login
 fam[0,i]:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]);
 fam[1,i]:=fL[0];
 end;end;end;end; // Fatto. Chiudiamo il file.
 CloseFile(F);
 Fl.Free;
 except
 on E: EInOutError do  ShowMessage('Errore nell'elaborazione del file. Dettagli: '+E.Message);
 end;end;

Mi scuso per "molto codice", i prossimi punti saranno più concisi.

2. Analogamente al metodo del punto precedente, leggiamo il risultato dell'elaborazione dell'elenco nell'elemento StringGrid, mentre presento un "pezzo significativo" di codice:

2.1 Otteniamo un elenco aggiornato delle sessioni RDP nel 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); // si può aspettare anche di più mentre il file viene creato per essere letto

2.2 Elaboriamo il file (sono indicate solo le righe significative del codice):

StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; //inseriamo in ciclo in StringGrid1
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); //rimuoviamo gli spazi dal login
if (SearchArr(login1)>=0) then //cerchiamo nell'array di p1. il login e registriamo nella tabella il nome e cognome
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; // altrimenti scriviamo un simbolo di plus:)
.... //in base alla scelta dell'utente, ordiniamo e formattiamo i dati
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2);  

3. La connessione vera e propria al clic sulla riga con l'utente e il numero della sua sessione:

  id:=(StringGrid1.Row);// otteniamo il numero della riga IntToStr(StringGrid1.Row)
  ids:=StringGrid1.Cells[2,id]; //otteniamo l'identificatore rdp
  cmdline:='/c mstsc /shadow:'+ ids; //e ci connettiamo....
 if (b_rdp.Checked=True) then  if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then;       

4. Sono stati aggiunti un paio di abbellimenti come l'ordinamento al clic sul radiobutton, e messaggi all'utente, o a tutti gli utenti.

Strumento per il collegamento shadow di un utente non admin a sessioni RDP in WinServer 2012R2

→ Il codice sorgente completo può essere visto qui

III. Applicazione di AdminLink — cosa ho osservato:

AdminLink genera effettivamente un collegamento che fa riferimento alla posizione dell'utilità admilaunch.exe, e una copia personale dell'utilità di avvio AdmiRun.Exe che si trova nella cartella dell'utente, ad esempio vasya, sul modello di C:UsersvasyaWINDOWS. In generale, non è tutto così male: con i diritti di accesso al file di collegamento e altro, per pulire la propria coscienza da amministratore, si può giocare un po'.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster