Dienstprogramm für den menschlichen Schatten, der Nicht-Administratoren mit RDP-Benutzersitzungen in WinServer 2012R2 verbindet

Das Problem während der Quarantänezeit des Unternehmens war wie folgt: Es ist wirklich notwendig, die Anzahl der Besuche von Spezialisten, die Anwendungssoftware warten und beraten, in Schränken zu minimieren. Offen gesagt missbrauchen Benutzer häufig die Hilfe von Spezialisten, die sich nicht mit der Frage selbst befassen möchten, und sagen: "Sie werden kommen - sie werden helfen, sie werden es tun und." während ich rauche / Kaffee trinke usw. " Die telefonische Beratung bei der Freigabe eines Servers ist beim Anzeigen eines Remote-Bildschirms effektiver.



Bereits nach der „Erfindung“ unseres Fahrrads tauchten vernünftige Informationen zum Thema des Artikels auf: RDS-Schatten - Schattenverbindung zu RDP-Benutzersitzungen in Windows Server 2012 R2 oder Schattenmodus eines nicht privilegierten Benutzers in Windows Server oder Wir delegieren die Verwaltung von RDP-Sitzungen . Alle von ihnen implizieren die Verwendung einer Konsole, selbst bei Elementen eines einfachen Dialogs.

Alle folgenden Informationen sind für diejenigen gedacht, die normalerweise abnormale Verzerrungen tolerieren , um das gewünschte Ergebnis zu erzielen und unnötige Methoden zu erfinden.
Um die Katze nicht am Schwanz zu ziehen, beginne ich mit dem letzten: Das Fahrrad funktioniert für den Durchschnittsbenutzer mit dem AdmiLink- Dienstprogramm , für das der Autor und danke.

I. Konsolen- und Schatten-RDP.

Da die Verwendung der Server Manager-Konsole mit Administratorrechten -> QuickSessionCollection -> durch Klicken auf die Sitzung des gewünschten Benutzers die Auswahl von Schatten aus dem Kontextmenü für Mitarbeiter, die in die Arbeit mit der Software eingewiesen werden, keine Option ist, wurde eine andere „hölzerne“ Methode in Betracht gezogen. nämlich:

1. Wir lernen die RDP-Sitzungs-ID:

query user | findstr Administrator

oder:

qwinsta | findstr Administrator 

Darüber hinaus war " | findstr Administrator " nur dann praktisch, wenn Sie genau wissen, was Sie als Administrator benötigen, oder wenn Sie nur den ersten Teil verwenden, um alle am Server angemeldeten Benutzer anzuzeigen .



2. Wir sind mit dieser Sitzung verbunden, sofern in den Domänengruppenrichtlinien die Option "Festlegen der Fernsteuerungsregeln für Benutzersitzungen von Remotedesktopdiensten" mindestens "Sitzung mit Benutzerberechtigung überwachen" ausgewählt ist ( mehr ):

mstsc /shadow:127

Bitte beachten Sie, dass die Liste nur Benutzeranmeldungen enthält.

Ich wiederhole, dass Sie ohne Administratorrechte Folgendes erhalten:



Für das vorläufige Debuggen des zu diskutierenden Programms habe ich jedoch ein Konto mit Administratorrechten verwendet.

II. Programm

Also die Erklärung des Problems: Erstellen einer Art einfacher grafischer Oberfläche, um mit seiner Erlaubnis eine Verbindung zum Schattensinn des Benutzers herzustellen und eine Nachricht an den Benutzer zu senden. Die Programmierumgebung wird von Lazarus ausgewählt.

1. Wir erhalten die vollständige Domain-Liste der Benutzer "Login" - "vollständiger Name" vom Administrator oder erneut über die Konsole:

wmic useraccount get Name,FullName 

niemand verbietet auch dies:

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

Ich muss sofort sagen, dass es Lazarus war, der das Problem mit der Verarbeitung dieser Datei hatte, da die Standardcodierung UCS-2 ist, also musste ich sie nur manuell in reguläres UTF-8 konvertieren. Es gibt viele Registerkarten in der Dateistruktur oder vielmehr viele Leerzeichen, die schließlich programmiert werden sollten. Früher oder später wird das Codierungsproblem gelöst und die Datei wird programmgesteuert aktualisiert.

In der Idee des Ordners, auf den Benutzer des Programms zugreifen können, z. B. c: \ test, in dem sich zwei Dateien befinden: die erste mit Login und Vollname, die zweite mit Benutzern von id_rdp und Login. Weiter verarbeiten wir diese Daten so gut wir können :).

In der Zwischenzeit übertragen wir diesen Inhalt (Login und vollständiger Name) in ein Array, um ihn mit der Liste der Sitzungen zu verknüpfen:

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;

Ich entschuldige mich für die "Menge Code", die folgenden Punkte werden prägnanter sein.

2. In ähnlicher Weise lesen wir mit der Methode aus dem vorherigen Absatz das Ergebnis der Verarbeitung der Liste in ein StringGrid-Element, während ich einen „signifikanten“ Code geben werde:

2.1 Die aktuelle Liste der RDP-Sitzungen in einer Datei abrufen :

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 Wir verarbeiten die Datei (es werden nur signifikante Codezeilen angezeigt):

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. Die Verbindung selbst, wenn Sie auf die Zeile mit dem Benutzer und seiner Sitzungsnummer klicken:

  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. Es wurden einige weitere Dekorationen vorgenommen, z. B. das Sortieren durch Klicken auf den Radiobutton und Nachrichten an den Benutzer oder alle Benutzer.



→ Den vollständigen Quellcode finden Sie hier

III. AdminLink-Anwendung - was ich gesehen habe:

AdminLink generiert wirklich eine Verknüpfung, die auf den Speicherort des Dienstprogramms admilaunch.exe verweist , und eine persönliche Kopie des Startdienstprogramms AdmiRun.Exe , das sich im Ordner des Benutzers befindet, z. B. vasya , wie C: \ Users \ vasya \ WINDOWS \ . Im Allgemeinen ist nicht alles so schlecht: Sie können mit den Zugriffsrechten auf die Verknüpfungsdatei und andere spielen, um Ihr eigenes Administrator-Gewissen zu löschen.

All Articles