Βοηθητικό πρόγραμμα για ανθρώπινη σκιώδη σύνδεση περιόδων σύνδεσης μη διαχειριστή σε χρήστες RDP στον WinServer 2012R2

Το πρόβλημα κατά την περίοδο της καραντίνας της επιχείρησης έγινε το εξής: είναι πραγματικά απαραίτητο να ελαχιστοποιηθεί ο αριθμός των επισκέψεων στα γραφεία από ειδικούς που εξυπηρετούν και συμβουλεύονται το λογισμικό εφαρμογών, και ειλικρινά μιλώντας, οι χρήστες συχνά κάνουν κατάχρηση της βοήθειας ειδικών χωρίς να θέλουν να εμβαθύνουν στο το ίδιο το θέμα, λένε «θα έρθουν - θα βοηθήσουν - θα το κάνουν, αλλά θα καπνίσω/πιω καφέ κ.λπ.». Η τηλεφωνική συνεννόηση κατά την κοινή χρήση διακομιστή είναι πιο αποτελεσματική εάν προβάλλετε την απομακρυσμένη οθόνη.

Βοηθητικό πρόγραμμα για ανθρώπινη σκιώδη σύνδεση περιόδων σύνδεσης μη διαχειριστή σε χρήστες RDP στον WinServer 2012R2

Μετά την «εφεύρεση» του ποδηλάτου μας, εμφανίστηκαν λογικές πληροφορίες για το θέμα του άρθρου: RDS Shadow – σκιώδης σύνδεση με συνεδρίες χρήστη RDP στον Windows Server 2012 R2 ή Μη προνομιούχος σκιώδης λειτουργία χρήστη στον διακομιστή Windows ή Διαχείριση συνόδων RDP με αντιπροσώπους. Όλα περιλαμβάνουν τη χρήση κονσόλας, ακόμη και με στοιχεία απλού διαλόγου.

Όλες οι παρακάτω πληροφορίες προορίζονται για όσους ανέχεται κανονικά ανώμαλες διαστροφές να επιτύχει το επιθυμητό αποτέλεσμα, επινοώντας περιττές μεθόδους.
Για να μην "τραβάω τη γάτα από την ουρά", θα ξεκινήσω με το τελευταίο: το ποδήλατο λειτουργεί για τον μέσο χρήστη που χρησιμοποιεί το βοηθητικό πρόγραμμα AdmiLink, για το οποίο χάρη στον συγγραφέα του.

I. Κονσόλα και σκιερό RDP.

Από τη χρήση με δικαιώματα διαχειριστή της κονσόλας Server Manager -> QuickSessionCollection -> κάνοντας κλικ στη συνεδρία του χρήστη που ενδιαφέρει, επιλέγοντας Shadow από το μενού περιβάλλοντος για το προσωπικό που καθοδηγεί τον τρόπο χρήσης του λογισμικού, δεν αποτελεί επιλογή, εξετάστηκε μια άλλη "ξύλινη" μέθοδος, και συγκεκριμένα:

1. Μάθετε το αναγνωριστικό RDP της συνεδρίας:

query user | findstr Administrator

ή:

qwinsta | findstr Administrator 

Εξάλλου "| findstr Διαχειριστής«Ήταν βολικό μόνο όταν ήξερες τι ακριβώς Διαχειριστής χρειάζεστε ή χρησιμοποιήστε μόνο το πρώτο μέρος για να δείτε όλους τους συνδεδεμένους στο διακομιστή.

Βοηθητικό πρόγραμμα για ανθρώπινη σκιώδη σύνδεση περιόδων σύνδεσης μη διαχειριστή σε χρήστες RDP στον WinServer 2012R2

2. Συνδεθείτε σε αυτήν την περίοδο λειτουργίας, με την προϋπόθεση ότι στον τομέα πολιτικές ομάδας Η επιλογή "Ρύθμιση κανόνων απομακρυσμένου ελέγχου για συνεδρίες χρήστη των υπηρεσιών απομακρυσμένης επιφάνειας εργασίας" είναι επιλεγμένη με τουλάχιστον την επιλογή "Παρακολούθηση συνεδρίας με άδεια χρήστη" (περισσότερο):

mstsc /shadow:127

Λάβετε υπόψη ότι η λίστα θα περιέχει μόνο συνδέσεις χρηστών.

Επαναλαμβάνω ότι χωρίς δικαιώματα διαχειριστή θα λάβετε τα εξής:

Βοηθητικό πρόγραμμα για ανθρώπινη σκιώδη σύνδεση περιόδων σύνδεσης μη διαχειριστή σε χρήστες RDP στον WinServer 2012R2

Αλλά για τον προκαταρκτικό εντοπισμό σφαλμάτων του προγράμματος που θα συζητηθεί, χρησιμοποίησα έναν λογαριασμό με δικαιώματα διαχειριστή.

II. Πρόγραμμα

Έτσι η δήλωση του προβλήματος: δημιουργία κάποιας απλής γραφικής διεπαφής για σύνδεση με τη σκιώδη αίσθηση του χρήστη με την άδειά του, αποστολή μηνύματος στον χρήστη. Το περιβάλλον προγραμματισμού που επιλέχθηκε είναι το Lazarus.

1. Λαμβάνουμε την πλήρη λίστα τομέα των χρηστών «login» - «full name» από τον διαχειριστή ή ξανά μέσω της κονσόλας:

wmic useraccount get Name,FullName 

κανείς δεν το απαγορεύει ούτε αυτό:

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

Θα πω αμέσως ότι ήταν ο Lazarus που είχε πρόβλημα με την επεξεργασία αυτού του αρχείου, καθώς από προεπιλογή η κωδικοποίησή του είναι UCS-2, οπότε έπρεπε απλώς να το μετατρέψω χειροκίνητα σε κανονικό UTF-8. Υπάρχουν πολλές καρτέλες στη δομή του αρχείου, ή μάλλον πολλά κενά, τα οποία αποφασίστηκε να επεξεργαστούμε μέσω προγραμματισμού· αργά ή γρήγορα το πρόβλημα κωδικοποίησης θα λυθεί και το αρχείο θα ενημερωθεί μέσω προγραμματισμού.

Έτσι, η ιδέα είναι να υπάρχει ένας φάκελος προσβάσιμος στους χρήστες του προγράμματος, για παράδειγμα c:test, στον οποίο θα υπάρχουν 2 αρχεία: το πρώτο με login και πλήρες όνομα, το δεύτερο με id_rdp και σύνδεση χρηστών. Στη συνέχεια, επεξεργαζόμαστε αυτά τα δεδομένα όσο καλύτερα μπορούμε :).

Στο μεταξύ, για να συσχετιστεί με τη λίστα των περιόδων σύνδεσης, μεταφέρουμε αυτό το περιεχόμενο (σύνδεση και πλήρες όνομα) σε έναν πίνακα:

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;

Ζητώ συγγνώμη για τον "πολύ κώδικα", τα ακόλουθα σημεία θα είναι πιο συνοπτικά.

2. Χρησιμοποιώντας την ίδια μέθοδο από την προηγούμενη παράγραφο, διαβάζουμε το αποτέλεσμα της επεξεργασίας της λίστας στο στοιχείο StringGrid, ενώ θα δώσω ένα «σημαντικό» κομμάτι κώδικα:

2.1 Λαμβάνουμε την τρέχουσα λίστα των συνεδριών RDP σε ένα αρχείο:

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 Επεξεργαστείτε το αρχείο (υποδεικνύονται μόνο σημαντικές γραμμές κώδικα):

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. Απευθείας σύνδεση κάνοντας κλικ στη γραμμή με τον χρήστη και τον αριθμό συνεδρίας του:

  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. Έχουν γίνει μερικές ακόμη διακοσμήσεις, όπως ταξινόμηση κάνοντας κλικ στο κουμπί ραδιοφώνου και μηνύματα προς τον χρήστη ή όλους τους χρήστες.

Βοηθητικό πρόγραμμα για ανθρώπινη σκιώδη σύνδεση περιόδων σύνδεσης μη διαχειριστή σε χρήστες RDP στον WinServer 2012R2

→ Μπορείτε να δείτε τον πλήρη πηγαίο κώδικα εδώ

III. Χρήση AdminLink - αυτό που είδα:

Το AdminLink δημιουργεί μια συντόμευση που αναφέρεται στη θέση του βοηθητικού προγράμματος admilaunch.exeκαι ένα προσωπικό αντίγραφο του βοηθητικού προγράμματος εκκίνησης AdmiRun.Exe που βρίσκεται στο φάκελο του χρήστη, για παράδειγμα βάσια, τύπος Γ: Χρήστες που χρησιμοποιούν WINDOWS. Γενικά, δεν είναι όλα τόσο άσχημα: μπορείτε να παίξετε με τα δικαιώματα πρόσβασης στο αρχείο συντόμευσης και άλλα για να καθαρίσετε τη συνείδησή σας διαχειριστή.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο