Problemi gjatĂ« periudhĂ«s sĂ« punĂ«s nĂ«n karantinĂ« u shfaq kĂ«shtu: Ă«shtĂ« vĂ«rtet e nevojshme tĂ« minimizojmĂ« numrin e vizitave tĂ« specialistĂ«ve qĂ« ofrojnĂ« dhe kĂ«shillojnĂ« pĂ«r softuerin aplikativ, dhe tĂ« themi hapur, pĂ«rdoruesit shpesh abuzojnĂ« me ndihmĂ«n e specialistĂ«ve pa dĂ«shiruar tĂ« kuptojnĂ« vetĂ« çështjen, tĂ« thonĂ« "do tĂ« vijnĂ« â do tĂ« ndihmojnĂ« â do ta bĂ«jnĂ«, ndĂ«rsa unĂ« do tĂ« pi tym apo kafe e kĂ«shtu me radhĂ«". Konsultimi pĂ«rmes telefonit gjatĂ« aksesi tĂ« pĂ«rbashkĂ«t nĂ« server Ă«shtĂ« mĂ« efektiv, nĂ«se shikojmĂ« ekranin e largĂ«t.

Pas "shpikjes" së biçikletës sonë, u shfaqin informacione të arsyeshme mbi temën e artikullit: ose ose . Të gjitha ato implicojnë përdorimin e konsolës, madje me elemente të dialogut të thjeshtë.
Të gjitha informacionet e paraqitura më poshtë janë për ata që mirëpranojnë devijimet e çuditshme për të arritur rezultatin e dëshiruar, duke shpikur mënyra të panevojshme.
Për të "mos e tërhequr macen për bisht", do të filloj me të fundit: biçikleta funksionon për përdoruesin normal me anë të utilitarit , për të cilin e falenderojmë autorin.
I. Konsola dhe shadow RDP.
Duke qenĂ« se pĂ«rdorimi me privilegj admini tĂ« konsolĂ«s Server Manager -> QuickSessionCollection -> duke klikuar mbi sesionin e pĂ«rdoruesit qĂ« na intereson, duke zgjedhur nĂ« menunĂ« kontekstuale Shadow (Kopja e Hijes) pĂ«r stafin qĂ« instrukton pĂ«r pĂ«rdorimin e softuerit, â nuk Ă«shtĂ« njĂ« opsion, u shqyrtua njĂ« metodĂ« tjetĂ«r "drunjake", konkretisht:
1. Zbulojmë id e sesionit RDP:
query user | findstr Administratorose:
qwinsta | findstr Administrator Dhe për më tepër "| findstr Administrator" ishte e dobishme vetëm kur e dinje se cilin informacion Administrator të nevojitet, ose përdor vetëm pjesën e parë për të parë të gjithë ata që janë regjistruar në server.
![]()
2. Lidhim me këtë sesion, me kusht që në politikat grupore të domainit parametri "Vendos rregullat për menaxhimin e largët për sesionet e përdoruesve të shërbimeve të punës në distancë" është zgjedhur me një parametër, të paktën "Vëzhgimi i sesionit me lejen e përdoruesit" ():
mstsc /shadow:127Ju lutem vini re se në listë do të jenë vetëm hyrjet e përdoruesve.
Përsëris se pa privilegjet e adminit do të merrni ndokënd ndryshe:

Por para debugging fillestar të programit, për të cilin do të flasim, kam përdorur një llogari me të drejta administratori.
II. Programi
Pra, qëllimi është: të krijohet një ndërfaqe grafike e thjeshtë për të lidhur me sensorin e errët të përdoruesit me lejen e tij, dhe për të dërguar një mesazh përdoruesit. Mjedisi i programimit është zgjedhur Lazarus.
1. Marrim listën e plotë të përdoruesve "login" - "emri i plotë" nga administrativa, ose gjithashtu përmes konsolës:
wmic useraccount get Name,FullName askush nuk ndalon ashtu:
wmic useraccount get Name,FullName > c:testusername.txtTë them menjëherë, se pikërisht në Lazarus kishte problem me përpunimin e këtij skedari, pasi për default kodimi i tij ishte UCS-2, prandaj duhej thjesht të konvertohej manualisht në UTF-8 të zakonshme. Në strukturën e skedarit kishte shumë tabulime, më saktë shumë hapësira, që u vendos të përpunoheshin programikisht, herët a vonë do të zgjidhet problemi i kodimit dhe skedari do të përditësohet programikisht.
Pra, në ide, një dosje e disponueshme për përdoruesit e programit, për shembull c:test, në të cilën do të kenë 2 skedare: e para me login dhe emrin e plotë, e dyta me id_rdp dhe login të përdoruesve. Më pas, këto të dhëna i përpunojmë si mundemi:).
Dhe që tani për të lidhur me listën e sesioneve, e transferojmë këtë (login dhe emrin e plotë) përmbajtje në një array:
procedure Tf_rdp.UserF2Array;
var
F:TextFile; i:integer; f1, line1:String; fL: TStringList;
begin
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, ' ', '|',[]);
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('Gabim në përpunimin e skedarit. Detajet: '+E.Message);
end;end;Ju kërkoj ndjesë për "shumë kod", pikat në vijim do të jenë më të shkurtra.
2. Po njëjtën metodë si në pikën e kaluar, lexojmë rezultatin e përpunimit të listës në elementin StringGrid, duke sjellë një pjesë "të rëndësishme" të kodit:
2.1 Marrim listën aktuale të sesioneve RDP në skedarin:
f1:=f_d+'user.txt';
cmdline:='\/c query user >'+ f1;
if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1)=0 then;
Sleep(500); \/\/ mund të presim edhe më shumë deri sa skedari të krijohet për lexim2.2 Procesojmë skedarin (kanë treguar vetëm rreshtat e rëndësishëm të kodit):
StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; \/\/ hedhim në cikël në StringGrid1
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); \/\/heqim hapësirat nga login-i
if (SearchArr(login1)>=0) then \/\/kërkojmë në array nga p1. login dhe shkruajmë në tabelën FIO
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; \/\/ ose shkruajmë një plus:)
.... \/\/ në varësi të zgjedhjes së përdoruesit, rendisim dhe formatizojmë sipas të dhënave
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2); 3. Vetë lidhja kur klikoni mbi rreshtin me përdoruesin dhe numrin e sesionit të tij:
id:=(StringGrid1.Row);\/\/ marrim numrin e rreshtit IntToStr(StringGrid1.Row)
ids:=StringGrid1.Cells[2,id]; \/\/ marrim identifikuesin rdp
cmdline:='\/c mstsc \/shadow:'+ ids; \/\/dhe lidhemi....
if (b_rdp.Checked=True) then if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then; 4. Janë bërë disa zbukurime të tjera si renditja me klikim mbi radiobutton, dhe mesazhet për përdoruesin ose për të gjithë përdoruesit.

â Kodu i plotĂ« mund tĂ« shihet
III. PĂ«rdorimi i AdminLink â ajo qĂ« kam parĂ«:
AdminLink për të vërtetë gjeneron një shkurtore, e cila të referohet në vendndodhjen e utilitarit admilaunch.exe, dhe kopjën personale të utilitarit të nisjes AdmiRun.Exe e cila ndodhet në dosjen e përdoruesit, për shembull vasya, në stilin C:UsersvasyaWINDOWS. Në përgjithësi, nuk është gjithçka kaq keq: me të drejtat e aksesit në skedarin e shkurtoreve dhe të tjerat, për të pastruar ndërgjegjen tonë administrative, mund të luajmë.
Burimi: habr.com
