Utilitaire pour l'ombre humaine connectant des administrateurs non administrateurs à des sessions utilisateur RDP dans WinServer 2012R2

Le problème pendant la période de quarantaine de l'entreprise était le suivant: il est vraiment nécessaire de minimiser le nombre de visites dans les armoires par des spécialistes qui entretiennent et conseillent sur les logiciels d'application, et franchement, les utilisateurs abusent souvent de l'aide de spécialistes ne voulant pas se plonger dans la question elle-même, en disant "ils viendront - ils aideront, ils le feront, et pendant que je fume / bois du café, etc. " La consultation par téléphone lors du partage d'un serveur est plus efficace lors de la visualisation d'un écran distant.



Déjà après «l'invention» de notre vélo, des informations sensées sont apparues sur le sujet de l'article: RDS Shadow - connexion shadow aux sessions utilisateur RDP dans Windows Server 2012 R2 ou mode Shadow d'un utilisateur non privilégié dans Windows Server ou Nous déléguons la gestion des sessions RDP . Tous impliquent l'utilisation d'une console, même avec des éléments d'un simple dialogue.

Toutes les informations ci-dessous sont destinées à ceux qui tolèrent normalement des distorsions anormales pour obtenir le résultat souhaité, en inventant des méthodes inutiles.
Afin de ne pas "tirer le chat par la queue", je vais commencer par le dernier: le vélo fonctionne pour l'utilisateur moyen en utilisant l'utilitaire AdmiLink , dont son auteur et merci.

I. Console et shadow RDP.

Étant donné que l'utilisation de la console du Gestionnaire de serveur avec des droits d'administrateur -> QuickSessionCollection -> en cliquant sur la session de l'utilisateur d'intérêt, la sélection de Shadow dans le menu contextuel pour le personnel chargé de travailler avec le logiciel n'est pas une option, une autre méthode «en bois» a été envisagée, à savoir:

1. Nous apprenons l'id de session RDP:

query user | findstr Administrator

ou:

qwinsta | findstr Administrator 

De plus, " | findstr Administrator " n'était pratique que lorsque vous savez exactement ce dont vous avez besoin Administrateur , ou utilisez uniquement la première partie pour voir tous les utilisateurs connectés au serveur.



2. Nous sommes connectés à cette session, à condition que dans les stratégies de groupe de domaine , le paramètre «Définit les règles de contrôle à distance pour les sessions utilisateur des services Bureau à distance» soit sélectionné au moins «Surveillance de la session avec l'autorisation utilisateur» ( plus ):

mstsc /shadow:127

Veuillez noter que la liste ne contiendra que les connexions des utilisateurs.

Je répète que sans droits d'administrateur, vous recevrez ce qui suit:



Mais pour le débogage préliminaire du programme qui sera discuté, j'ai utilisé un compte avec des droits d'administrateur.

II. Programme

Donc l'énoncé du problème: créer une sorte d'interface graphique simple pour se connecter au sens de l'ombre de l'utilisateur avec sa permission, envoyer un message à l'utilisateur. L'environnement de programmation est sélectionné par Lazarus.

1. Nous obtenons la liste complète des domaines des utilisateurs «login» - «nom complet» de l'administrateur, ou encore via la console:

wmic useraccount get Name,FullName 

personne n'interdit même cela:

wmic useraccount get Name,FullName > c:\test\username.txt

Je dois dire tout de suite que c'est Lazarus qui a eu le problème avec le traitement de ce fichier, car son encodage par défaut est UCS-2, donc je n'ai eu qu'à le convertir manuellement en UTF-8 normal. Il y a beaucoup d'onglets dans la structure du fichier, ou plutôt, beaucoup d'espaces qui ont finalement été programmés pour être programmés, tôt ou tard le problème d'encodage sera résolu et le fichier sera mis à jour par programme.

Donc, dans l'idée du dossier, accessible aux utilisateurs du programme, par exemple c: \ test, dans lequel il y aura 2 fichiers: le premier avec login et fullname, le second avec id_rdp et login utilisateurs. De plus, nous traitons ces données comme nous le pouvons :).

En attendant, pour nous associer à la liste des sessions, nous transférons ce contenu (login et nom complet) dans un tableau:

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;

Je m'excuse pour le "lot de code", les points suivants seront plus concis.

2. De même, en utilisant la méthode du paragraphe précédent, nous lisons le résultat du traitement de la liste en un élément StringGrid, tandis que je donnerai un morceau de code «significatif»:

2.1 Nous obtenons la liste réelle des sessions RDP dans un fichier:

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 Nous traitons le fichier (seules les lignes de code significatives sont indiquées):

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. La connexion elle-même lorsque vous cliquez sur la ligne avec l'utilisateur et son numéro de session:

  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. Quelques autres décorations ont été faites, comme le tri en cliquant sur le bouton radio, et des messages à l'utilisateur ou à tous les utilisateurs.



→ Le code source complet peut être vu ici

III. Application AdminLink - ce que j'ai vu:

AdminLink génère vraiment un raccourci qui fait référence à l'emplacement de l'utilitaire admilaunch.exe et une copie personnelle du lanceur AdmiRun.Exe qui se trouve dans le dossier de l'utilisateur, par exemple vasya , comme C: \ Users \ vasya \ WINDOWS \ . En général, tout n'est pas si mal: vous pouvez jouer avec les droits d'accès au fichier de raccourci et autres, pour effacer votre propre conscience d'administrateur.

All Articles