Korxonaning karantin davridagi muammo quyidagicha bo'ldi: haqiqatan ham amaliy dasturiy ta'minot bo'yicha xizmat ko'rsatuvchi va maslahat beradigan mutaxassislarning ofislarga tashrifi sonini minimallashtirish kerak, va ochig'ini aytganda, foydalanuvchilar ko'pincha mutaxassislarning yordamini suiiste'mol qilishni istamasdan suiiste'mol qiladilar. Muammoning o'zi, ular "ular kelishadi - yordam berishadi - ular buni qilishadi, lekin men chekaman / qahva ichaman va hokazo" deyishadi. Agar masofaviy ekranni ko'rsangiz, serverni ulashishda telefon orqali maslahat berish samaraliroq bo'ladi.
Velosipedimiz "ixtiro qilinganidan" keyin maqola mavzusi bo'yicha aqlli ma'lumotlar paydo bo'ldi:
Quyidagi barcha ma'lumotlar kimlar uchun mo'ljallangan g'ayritabiiy buzilishlarga odatda toqat qiladi keraksiz usullarni ixtiro qilib, kerakli natijaga erishish.
"Mushukni dumidan tortib olmaslik" uchun men oxirgisidan boshlayman: velosiped yordamchi dasturdan foydalanadigan oddiy foydalanuvchi uchun ishlaydi.
I. Konsol va soyali RDP.
bilan foydalangandan beri Server menejeri konsolining administrator huquqlari -> QuickSessionCollection -> qiziqtirgan foydalanuvchi seansini bosish orqali kontekst menyusidan Shadow-ni tanlang. dasturiy ta'minotdan foydalanish bo'yicha ko'rsatmalar beradigan xodimlar uchun, variant emas, boshqa "yog'och" usul ko'rib chiqildi, xususan:
1. Seansning RDP identifikatorini toping:
query user | findstr Administrator
yoki:
qwinsta | findstr Administrator
Bundan tashqari "| findstr AdministratorβBu siz aniq nima ekanligini bilganingizdagina qulay edi Administrator Sizga kerak, yoki hammaning serverga kirganligini ko'rish uchun faqat birinchi qismdan foydalaning.
2. Domenda bo'lishi sharti bilan ushbu sessiyaga ulaning guruh siyosati "Masofaviy ish stoli xizmatlarining foydalanuvchi seanslari uchun masofadan boshqarish qoidalarini sozlash" opsiyasi kamida "Foydalanuvchi ruxsati bilan seansni kuzatish" opsiyasi tanlangan holda tanlanadi (
mstsc /shadow:127
E'tibor bering, ro'yxat faqat foydalanuvchi loginlarini o'z ichiga oladi.
Takror aytamanki, administrator huquqlarisiz siz quyidagilarni olasiz:
Ammo muhokama qilinadigan dasturni oldindan tuzatish uchun men administrator huquqlariga ega hisob qaydnomasidan foydalandim.
II. Dastur
Shunday qilib, muammo bayoni: foydalanuvchining ruxsati bilan uning soya tuyg'usiga ulanish uchun oddiy grafik interfeysni yaratish, foydalanuvchiga xabar yuborish. Tanlangan dasturlash muhiti - Lazarus.
1. Biz foydalanuvchilarning "login" - "to'liq ism" domenlarining to'liq ro'yxatini administratordan yoki yana konsol orqali olamiz:
wmic useraccount get Name,FullName
Hech kim buni taqiqlamaydi:
wmic useraccount get Name,FullName > c:testusername.txt
Men darhol aytamanki, aynan Lazarus ushbu faylni qayta ishlashda muammoga duch keldi, chunki sukut bo'yicha uning kodlashi UCS-2, shuning uchun uni oddiy UTF-8 ga qo'lda aylantirishim kerak edi. Fayl tuzilmasida juda ko'p yorliqlar, aniqrog'i juda ko'p bo'shliqlar mavjud bo'lib, ularni dasturiy jihatdan qayta ishlashga qaror qilindi; ertami-kechmi kodlash muammosi hal qilinadi va fayl dasturiy jihatdan yangilanadi.
Shunday qilib, g'oya dastur foydalanuvchilari uchun ochiq bo'lgan papkaga ega bo'lishdir, masalan, c: test, unda 2 ta fayl bo'ladi: birinchisida login va to'liq ism, ikkinchisida id_rdp va foydalanuvchilarning loginlari mavjud. Keyinchalik, biz ushbu ma'lumotlarni iloji boricha qayta ishlaymiz :).
Ayni paytda, seanslar ro'yxati bilan bog'lanish uchun biz ushbu (login va to'liq ism) tarkibni massivga o'tkazamiz:
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;
Men "ko'p kod" uchun uzr so'rayman, quyidagi fikrlar qisqaroq bo'ladi.
2. Oldingi paragrafdagi xuddi shu usuldan foydalanib, biz ro'yxatni StringGrid elementiga qayta ishlash natijasini o'qiymiz, men esa "muhim" kod qismini beraman:
2.1 Biz RDP seanslarining joriy ro'yxatini faylda olamiz:
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 Faylni qayta ishlash (faqat muhim kod satrlari ko'rsatilgan):
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. Foydalanuvchi va uning sessiya raqami bilan chiziqni bosish orqali to'g'ridan-to'g'ri ulanishning o'zi:
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. Radio tugmachasini bosish orqali saralash va foydalanuvchi yoki barcha foydalanuvchilarga xabarlar kabi yana bir nechta bezaklar yaratildi.
β To'liq manba kodini ko'rish mumkin
III. AdminLink-dan foydalanish - men ko'rgan narsam:
AdminLink yordam dasturining joylashgan joyiga havola qiluvchi yorliq yaratadi admilaunch.exe, va ishga tushirish yordam dasturining shaxsiy nusxasi AdmiRun.Exe masalan, foydalanuvchi papkasida joylashgan Vasya, turi C: WINDOWS foydalanuvchilari. Umuman olganda, hamma narsa unchalik yomon emas: siz o'zingizning administrator vijdoningizni tozalash uchun yorliq fayliga va boshqalarga kirish huquqlari bilan o'ynashingiz mumkin.
Manba: www.habr.com