Dienstprogramm für die Human-Shadow-Verbindung von Nicht-Administratorsitzungen zu RDP-Benutzersitzungen in WinServer 2012R2

Das Problem während der Quarantänezeit des Unternehmens wurde zu folgendem: Es ist wirklich notwendig, die Anzahl der Bürobesuche von Spezialisten für die Wartung und Beratung von Anwendungssoftware zu minimieren, und ehrlich gesagt missbrauchen Benutzer oft die Hilfe von Spezialisten, ohne sich damit befassen zu wollen Beim Problem selbst sagen sie: „Sie werden kommen – sie werden helfen – sie werden es tun, aber ich werde rauchen/Kaffee trinken usw.“ Die telefonische Beratung beim Teilen eines Servers ist effektiver, wenn Sie den Remote-Bildschirm betrachten.

Dienstprogramm für die Human-Shadow-Verbindung von Nicht-Administratorsitzungen zu RDP-Benutzersitzungen in WinServer 2012R2

Nach der „Erfindung“ unseres Fahrrads tauchten vernünftige Informationen zum Thema des Artikels auf: RDS Shadow – Schattenverbindung zu RDP-Benutzersitzungen in Windows Server 2012 R2 oder Unprivilegierter Benutzerschattenmodus in Windows Server oder Delegieren Sie die Verwaltung von RDP-Sitzungen. Alle beinhalten die Verwendung einer Konsole, sogar mit Elementen eines einfachen Dialogs.

Alle folgenden Informationen richten sich an diejenigen, die toleriert normalerweise abnormale Perversionen Um das gewünschte Ergebnis zu erzielen, müssen unnötige Methoden erfunden werden.
Um die Katze nicht am Schwanz zu ziehen, fange ich mit dem letzten Punkt an: Das Fahrrad funktioniert für den durchschnittlichen Benutzer, der das Dienstprogramm nutzt AdmiLink, wofür ich mich bei seinem Autor bedanke.

I. Konsolen- und Schatten-RDP.

Seit der Verwendung mit Administratorrechte der Server Manager-Konsole -> QuickSessionCollection -> indem Sie auf die Sitzung des gewünschten Benutzers klicken und im Kontextmenü Shadow auswählen für Personal, das den Umgang mit der Software anleitetDa dies keine Option ist, wurde eine andere „hölzerne“ Methode in Betracht gezogen, nämlich:

1. Ermitteln Sie die RDP-ID der Sitzung:

query user | findstr Administrator

oder:

qwinsta | findstr Administrator 

Darüber hinaus "| findstr-Administrator„Es war nur praktisch, wenn man genau wusste, was.“ Administrator Sie benötigen, oder verwenden Sie nur den ersten Teil, um alle am Server angemeldeten Personen anzuzeigen.

Dienstprogramm für die Human-Shadow-Verbindung von Nicht-Administratorsitzungen zu RDP-Benutzersitzungen in WinServer 2012R2

2. Stellen Sie eine Verbindung zu dieser Sitzung her, sofern diese in der Domäne vorhanden ist Gruppenrichtlinien Die Option „Fernsteuerungsregeln für Benutzersitzungen von Remotedesktopdiensten einrichten“ ist ausgewählt, wobei mindestens die Option „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:

Dienstprogramm für die Human-Shadow-Verbindung von Nicht-Administratorsitzungen zu RDP-Benutzersitzungen in WinServer 2012R2

Aber für das vorläufige Debuggen des Programms, das besprochen wird, habe ich ein Konto mit Administratorrechten verwendet.

II. Programm

Also die Problemstellung: Erstellen einer einfachen grafischen Oberfläche, um mit seiner Erlaubnis eine Verbindung zum Schattensinn des Benutzers herzustellen und eine Nachricht an den Benutzer zu senden. Als Programmierumgebung wurde Lazarus gewählt.

1. Wir erhalten die vollständige Domänenliste der Benutzer „Login“ – „vollständiger Name“ vom Administrator oder erneut über die Konsole:

wmic useraccount get Name,FullName 

Niemand verbietet nicht einmal das:

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

Ich sage gleich, dass es Lazarus war, der ein Problem mit der Verarbeitung dieser Datei hatte, da ihre Kodierung standardmäßig UCS-2 ist, also musste ich sie nur manuell in normales UTF-8 konvertieren. Es gibt viele Tabulatoren in der Dateistruktur bzw. viele Leerzeichen, die man programmgesteuert verarbeiten wollte; früher oder später wird das Kodierungsproblem gelöst und die Datei wird programmgesteuert aktualisiert.

Die Idee besteht also darin, einen für Benutzer des Programms zugänglichen Ordner zu haben, zum Beispiel c:test, in dem sich zwei Dateien befinden: die erste mit Login und vollständigem Namen, die zweite mit id_rdp und Login der Benutzer. Als nächstes verarbeiten wir diese Daten so gut wir können :).

In der Zwischenzeit übertragen wir zur Verknüpfung mit der Liste der Sitzungen diesen Inhalt (Anmeldename und vollständiger Name) in ein 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;

Ich entschuldige mich für den „viel Code“, die folgenden Punkte werden prägnanter sein.

2. Mit der gleichen Methode aus dem vorherigen Absatz lesen wir das Ergebnis der Verarbeitung der Liste in das StringGrid-Element, während ich einen „signifikanten“ Codeabschnitt gebe:

2.1 Wir erhalten die aktuelle Liste der RDP-Sitzungen in einer Datei:

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 Verarbeiten Sie die Datei (nur wichtige Codezeilen werden 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. Direkte Verbindung selbst durch Klicken auf die Zeile mit dem Benutzer und seiner Sitzungsnummer:

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

Dienstprogramm für die Human-Shadow-Verbindung von Nicht-Administratorsitzungen zu RDP-Benutzersitzungen in WinServer 2012R2

→ Der vollständige Quellcode ist sichtbar hier

III. Verwendung von AdminLink – was ich gesehen habe:

AdminLink generiert eine Verknüpfung, die auf den Speicherort des Dienstprogramms verweist admilaunch.exeund eine persönliche Kopie des Startprogramms AdmiRun.Exe die sich beispielsweise im Ordner des Benutzers befindet Wasja, Typ C:BenutzervasyaWINDOWS. Im Allgemeinen ist nicht alles so schlecht: Sie können mit Zugriffsrechten auf die Verknüpfungsdatei und andere herumspielen, um Ihr eigenes Administratorgewissen zu klären.

Source: habr.com

Kommentar hinzufügen