Ang problema sa panahon sa pagkuwarentinas sa negosyo nahimo nga mga musunud: kinahanglan gyud nga maminusan ang gidaghanon sa mga pagbisita sa mga opisina sa mga espesyalista nga nagserbisyo ug nagkonsulta sa software sa aplikasyon, ug sa prangka nga pagsulti, ang mga tiggamit kanunay nga nag-abuso sa tabang sa mga espesyalista nga dili gusto nga masusi. Ang isyu mismo, giingon nila "moabot sila - motabang sila - buhaton nila, pero manigarilyo/moinom ko og kape, etc." Ang konsultasyon sa telepono kung magpaambit sa usa ka server mas epektibo kung imong tan-awon ang hilit nga screen.
Pagkahuman sa "imbensyon" sa among bisikleta, ang maayong kasayuran sa hilisgutan sa artikulo mitungha:
Ang tanang impormasyon sa ubos gituyo alang niadtong kinsa normal ang pagtugot sa abnormal nga mga kahiwian aron makuha ang gitinguha nga resulta, pag-imbento sa dili kinahanglan nga mga pamaagi.
Aron dili "ibira ang iring pinaagi sa ikog," magsugod ako sa katapusan: ang bisikleta magamit alang sa kasagaran nga tiggamit gamit ang utility
I. Console ug anino RDP.
Sukad sa paggamit sa mga katungod sa tagdumala sa console sa Server Manager -> QuickSessionCollection -> pinaagi sa pag-klik sa sesyon sa tiggamit sa interes, pagpili sa Shadow gikan sa menu sa konteksto alang sa mga personahe nga nagtudlo unsaon paggamit sa software, dili usa ka kapilian, laing "kahoy" nga pamaagi ang gikonsiderar, nga mao:
1. Hibal-i ang RDP id sa sesyon:
query user | findstr Administrator
o:
qwinsta | findstr Administrator
Dugang pa"| findstr Administrator"Kombenyente ra kung nahibal-an nimo kung unsa gyud Administrator kinahanglan nimo, o gamita lamang ang unang bahin aron makita ang tanan nga naka-log in sa server.
2. Sumpaysumpaya niini nga sesyon, basta anaa sa domain polisiya sa grupo Ang opsyon nga "I-set up ang remote control para sa mga sesyon sa user sa Remote Desktop Services" nga adunay labing menos ang opsyon nga "Monitor session with user permission" (
mstsc /shadow:127
Palihug timan-i nga ang listahan maglangkob lamang sa mga login sa user.
Gisubli nako nga kung walaβy mga katungod sa admin makuha nimo ang mga musunud:
Apan alang sa pasiuna nga pag-debug sa programa nga hisgutan, gigamit nako ang usa ka account nga adunay mga katungod sa tagdumala.
II. Programa
Busa ang problema nga pahayag: paghimo sa pipila ka yano nga graphical interface sa pagkonektar sa anino pagbati sa user uban sa iyang pagtugot, pagpadala sa usa ka mensahe ngadto sa user. Ang programming environment nga gipili mao si Lazarus.
1. Nakuha namo ang tibuok lista sa domain sa mga tiggamit nga "login" - "bug-os nga ngalan" gikan sa tagdumala, o pag-usab pinaagi sa console:
wmic useraccount get Name,FullName
walay nagdili bisan niini:
wmic useraccount get Name,FullName > c:testusername.txt
Isulti ko dayon nga si Lazarus ang adunay problema sa pagproseso niini nga file, tungod kay sa default ang pag-encode niini mao ang UCS-2, mao nga kinahanglan nako nga mano-mano nga i-convert kini sa regular nga UTF-8. Adunay daghang mga tab sa istruktura sa file, o labi pa nga daghang mga wanang, nga nakahukom nga iproseso ang programmatically; sa madugay o sa madali ang problema sa pag-encode masulbad, ug ang file ma-update sa programmatically.
Busa, ang ideya mao nga adunay usa ka folder nga ma-access sa mga tiggamit sa programa, pananglitan c:test, diin adunay 2 ka mga file: ang una nga adunay login ug fullname, ang ikaduha nga adunay id_rdp ug login sa mga tiggamit. Sunod, among giproseso kini nga datos kutob sa among mahimo :).
Sa kasamtangan, aron makig-uban sa lista sa mga sesyon, among gibalhin kini (login ug fullname) nga mga sulod sa usa ka 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;
Nangayo ko og pasaylo sa "daghang code", ang mosunod nga mga punto mahimong mas mubo.
2. Gamit ang parehas nga pamaagi gikan sa miaging parapo, among gibasa ang resulta sa pagproseso sa lista sa elemento sa StringGrid, samtang maghatag ako usa ka "mahinungdanon" nga piraso sa code:
2.1 Among nadawat ang kasamtangang listahan sa mga sesyon sa RDP sa usa ka file:
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 Iproseso ang file (mahinungdanon ra nga linya sa code ang gipakita):
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. Direktang koneksyon mismo pinaagi sa pag-klik sa linya sa user ug sa numero sa iyang sesyon:
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. Pipila pa ka mga dekorasyon ang nahimo, sama sa paghan-ay pinaagi sa pag-klik sa radiobutton, ug mga mensahe ngadto sa tiggamit o sa tanang tiggamit.
β Makita ang tibuok source code
III. Gamit ang AdminLink - ang akong nakita:
Ang AdminLink naghimo og usa ka shortcut nga nagpunting sa lokasyon sa utility admilaunch.exe, ug usa ka personal nga kopya sa utility sa paglansad AdmiRun.Exe nga nahimutang sa folder sa user, pananglitan Vasya, matang C:UsersvasyaWINDOWS. Sa kinatibuk-an, dili tanan daotan kaayo: mahimo ka nga magdula sa mga katungod sa pag-access sa shortcut file ug uban pa aron malimpyohan ang imong kaugalingon nga konsensya sa admin.
Source: www.habr.com