Enpresaren berrogeialdi garaian arazoa honako hau bihurtu zen: benetan beharrezkoa da aplikazio-softwarean zerbitzua ematen eta kontsultatzen duten espezialisten bulegoetara bisita kopurua murriztea, eta egia esanda, erabiltzaileek askotan espezialisten laguntzaz abusatzen dute sakondu nahi izan gabe. gaia bera, "etorri egingo dira - lagunduko dute - egingo dute, baina kafea erre/edango dut, etab". Zerbitzari bat partekatzean telefono bidezko kontsulta eraginkorragoa da urruneko pantaila ikusten baduzu.
Gure bizikletaren "asmakuntza" ondoren, artikuluaren gaiari buruzko informazio sanoa agertu zen:
Beheko informazio guztia dutenei zuzenduta dago perbertsio anormalak normaltasunez onartzen ditu nahi den emaitza lortzeko, beharrezkoak ez diren metodoak asmatuz.
"Katuari buztanetik tira" ez egiteko, azken honekin hasiko naiz: bizikletak erabilgarritasuna erabiltzen duen erabiltzaile arruntarentzat funtzionatzen du.
I. Kontsola eta itzaleko RDP.
-rekin erabiltzen denetik Server Manager kontsolaren administratzaile-eskubideak -> QuickSessionCollection -> interesa duen erabiltzailearen saioan klik eginez, laster-menuan Itzala hautatuz softwarea nola erabili irakasten duten langileentzat, ez da aukera bat, beste "egurrezko" metodo bat hartu zen kontuan, hau da:
1. Ezagutu saioaren RDP IDa:
query user | findstr Administrator
edo:
qwinsta | findstr Administrator
Gainera "| findstr Administratzailea"Zer zehatz zekienean bakarrik erosoa zen administrator behar duzu, edo erabili lehen zatia bakarrik zerbitzarian saioa hasita dauden guztiak ikusteko.
2. Konektatu saio honetara, betiere domeinuan talde politikak "Konfiguratu urruneko kontrol-arauak Urruneko Mahaigaineko Zerbitzuen erabiltzaile-saioetarako" aukera hautatzen da gutxienez "Begiratu saioa erabiltzailearen baimenarekin" aukera hautatuta (
mstsc /shadow:127
Kontuan izan zerrendak erabiltzaileen saioak soilik izango dituela.
Errepikatzen dut administratzaile eskubiderik gabe honako hau lortuko duzula:
Baina eztabaidatuko den programaren aurretiazko arazketa egiteko, administratzaile-eskubideak dituen kontu bat erabili dut.
II. Programa
Beraz, arazoaren adierazpena: interfaze grafiko sinple bat sortzea erabiltzailearen baimenarekin erabiltzailearen itzal-zentzura konektatzeko, erabiltzaileari mezu bat bidaliz. Aukeratutako programazio ingurunea Lazaro da.
1. Erabiltzaileen "saioa" - "izen osoa" domeinu-zerrenda osoa jasotzen dugu administratzailearengandik, edo berriro kontsolaren bidez:
wmic useraccount get Name,FullName
inork ez du debekatzen hau ere:
wmic useraccount get Name,FullName > c:testusername.txt
Berehala esango dut Lazaro izan zela fitxategi hau prozesatzeko arazoa izan zuena, bere kodifikazioa UCS-2 delako lehenespenez, beraz, eskuz UTF-8 arrunt bihurtu behar izan nuen. Fitxategien egituran fitxa asko daude, edo hobeto esanda, programazioz prozesatzea erabaki zen espazio asko; lehenago edo beranduago kodeketa arazoa konponduko da, eta fitxategia programatikoki eguneratuko da.
Beraz, programaren erabiltzaileentzat eskuragarri dagoen karpeta bat izatea da asmoa, adibidez c:test, eta bertan 2 fitxategi egongo dira: lehenengoa login eta fullnamerekin, bigarrena id_rdp eta erabiltzaileen loginarekin. Ondoren, datu hauek ahalik eta ondoen prozesatzen ditugu :).
Bitartean, saioen zerrendarekin lotzeko, eduki hau (saioa eta izen-abizenak) array batera transferitzen dugu:
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;
Barkatu "kode askogatik", hurrengo puntuak zehatzagoak izango dira.
2. Aurreko paragrafoko metodo bera erabiliz, zerrenda prozesatzearen emaitza StringGrid elementuan irakurriko dugu, kode zati "esanguratsu" bat emango dudan bitartean:
2.1 RDP saioen uneko zerrenda fitxategi batean jasoko dugu:
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 Fitxategia prozesatu (kode-lerro esanguratsuak soilik adierazten dira):
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. Zuzeneko konexioa bera erabiltzailearekin eta bere saioaren zenbakia duen lerroan klik eginez:
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. Apaingarri pare bat gehiago egin dira, hala nola, irrati-botoian klik eginez ordenatzea eta erabiltzaileari edo erabiltzaile guztiei mezuak.
β Iturburu-kode osoa ikus daiteke
III. AdminLink erabiliz - zer ikusi nuen:
AdminLink-ek erabilgarritasunaren kokapenari erreferentzia egiten dion lasterbide bat sortzen du admilaunch.exe, eta abiarazteko utilitatearen kopia pertsonala AdmiRun.Exe erabiltzailearen karpetan dagoena, adibidez Vasia, idatzi C: UsersvasyaWINDOWS. Oro har, dena ez da hain txarra: lasterbideen fitxategirako sarbide-eskubideekin eta besteekin jolastu dezakezu zure administratzailearen kontzientzia garbitzeko.
Iturria: www.habr.com