De Problem während der Quarantänperiod vun der Entreprise gouf de folgenden: et ass wierklech néideg d'Zuel vun de Visiten an de Büroe vu Spezialisten ze minimiséieren, déi iwwer Applikatiounssoftware servéieren an konsultéieren, an éierlech gesoot, Benotzer mëssbrauchen dacks d'Hëllef vu Spezialisten ouni ze verdéiwen. d'Thema selwer, si soen "si kommen - si wäerten hëllefen - si maachen et, awer ech fëmmen / drénken Kaffi, etc." Telefonkonsultatioun wann Dir e Server deelt ass méi effektiv wann Dir de Fernbildschierm kuckt.

No der "Erfindung" vun eisem Vëlo ass verstänneg Informatiounen zum Thema vum Artikel opgetaucht: oder oder . All vun hinnen beinhalt d'Benotzung vun enger Konsole, och mat Elementer vun engem einfachen Dialog.
All Informatioun hei drënner ass fir déi geduecht, déi toleréiert anormal Perversiounen normalerweis fir dat gewënschte Resultat ze kréien, onnéideg Methoden erfannen.
Fir net "d'Kaz um Schwanz ze zéien", fänken ech mat der leschter un: de Vëlo funktionnéiert fir den duerchschnëttleche Benotzer mat dem Utility , fir déi Merci un hiren Auteur.
I. Konsol a Schied RDP.
Zanter benotzen mat Administrator Rechter vun der Server Manager Konsol -> QuickSessionCollection -> andeems Dir op d'Sessioun vum interesséierte Benotzer klickt, Shadow aus dem Kontextmenü auswielen fir Personal ze instruéieren wéi d'Software ze benotzen, ass keng Optioun, eng aner "Holz" Method gouf berücksichtegt, nämlech:
1. Fannt d'RDP ID vun der Sessioun eraus:
query user | findstr Administratoroder:
qwinsta | findstr Administrator Ausserdeem "| findstr Administrator"Et war nëmme bequem wann Dir wousst wat genau Administrator Dir braucht, oder benotzt nëmmen den éischten Deel fir e gesinn jiddereen op de Server ageloggt.
![]()
2. Connect zu dëser Sëtzung, virausgesat datt am Domain Grupp Politiken D'Optioun "Fernsteuerungsregele fir Benotzersessiounen vun Remote Desktop Services opsetzen" ass ausgewielt mat op d'mannst d'Optioun "Monitor Sessioun mat Benotzererlaabnes" ausgewielt ():
mstsc /shadow:127Maacht weg datt d'Lëscht nëmme Benotzer Login enthält.
Ech widderhuelen datt ouni Admin Rechter Dir déi folgend kritt:

Awer fir virleefeg Debugging vum Programm deen diskutéiert gëtt, hunn ech e Kont mat Administratorrechter benotzt.
II. Programm
Also d'Problem Ausso: eng einfach graphesch Interface erstellen fir dem Benotzer säi Schiedsënn mat senger Erlaabnes ze verbannen, e Message un de Benotzer ze schécken. D'programméiere Ëmfeld gewielt ass Lazarus.
1. Mir kréien déi komplett Domain Lëscht vun de Benotzer "Login" - "voll Numm" vum Administrator, oder nach eng Kéier duerch d'Konsol:
wmic useraccount get Name,FullName keen verbitt och dat:
wmic useraccount get Name,FullName > c:testusername.txtEch wäert direkt soen datt et de Lazarus war deen e Problem mat der Veraarbechtung vun dëser Datei hat, well seng Kodéierung als Standard UCS-2 ass, also muss ech se just manuell op normale UTF-8 konvertéieren. Et gi vill Tabs an der Dateistruktur, oder éischter vill Plazen, déi decidéiert gouf programmatesch ze veraarbechten; fréier oder spéider gëtt de Kodéierungsproblem geléist, an d'Datei gëtt programmatesch aktualiséiert.
Also, d'Iddi ass en Dossier zougänglech fir Benotzer vum Programm ze hunn, zum Beispill c:test, an deem et 2 Dateien gëtt: déi éischt mat Login a Vollnumm, déi zweet mat id_rdp a Login vun de Benotzer. Als nächst veraarbechte mir dës Donnéeën sou gutt wéi méiglech :).
An der Tëschenzäit, fir mat der Lëscht vun de Sessiounen ze associéieren, transferéiere mir dësen (Login a Vollnumm) Inhalter op eng 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;Ech entschëllege mech fir de "vill Code", déi folgend Punkte wäerte méi präzis sinn.
2. Mat der selwechter Method aus dem virege Paragraphe liesen mir d'Resultat vun der Veraarbechtung vun der Lëscht an de StringGrid Element, während ech e "bedeitend" Code ginn:
2.1 Mir kréien déi aktuell Lëscht vun RDP Sessiounen an engem 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 Veraarbecht d'Datei (nëmme bedeitend Codelinne ginn uginn):
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. Direkt Verbindung selwer andeems Dir op d'Linn mam Benotzer a senger Sessiounsnummer klickt:
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. E puer méi Dekoratioune goufe gemaach, wéi z.B. Sortéieren andeems Dir op de Radiobutton klickt, a Messagen un de Benotzer oder all Benotzer.

→ Voll Quellcode ka gesi ginn
III. Benotzt AdminLink - wat ech gesinn hunn:
AdminLink generéiert eng Ofkiirzung déi de Standuert vum Utility referéiert admilaunch.exe, an eng perséinlech Kopie vum Start Utility AdmiRun.Exe déi zum Beispill am Dossier vum Benotzer läit Vasya, Typ C: UsersvasyaWINDOWS. Am Allgemengen ass net alles sou schlecht: Dir kënnt mat Zougangsrechter fir d'Ofkiirzungsdatei an anerer spillen fir Äert eegent Admin Gewëssen ze läschen.
Source: will.com
