Problemi gjatë periudhës së karantinës së ndërmarrjes u bë si vijon: është me të vërtetë e nevojshme të minimizohet numri i vizitave në zyra nga specialistë që shërbejnë dhe këshillohen për programet e aplikacionit, dhe sinqerisht, përdoruesit shpesh abuzojnë me ndihmën e specialistëve pa dashur të thellohen në vetë çështjen, thonë “do të vijnë – do të ndihmojnë – do ta bëjnë, por unë do të pi duhan/pij kafe etj”. Konsultimi telefonik kur ndani një server është më efektiv nëse shikoni ekranin në distancë.
Pas "shpikjes" së biçikletës sonë, dolën informacione të arsyeshme mbi temën e artikullit:
Të gjitha informacionet e mëposhtme janë të destinuara për ata që toleron normalisht perversionet anormale për të marrë rezultatin e dëshiruar, duke shpikur metoda të panevojshme.
Për të mos "tërhequr macen nga bishti", do të filloj me të fundit: biçikleta funksionon për përdoruesin mesatar që përdor shërbimin
I. Konsola dhe RDP hije.
Që nga përdorimi me të drejtat e administratorit të konsolës së Menaxherit të Serverit -> QuickSessionCollection -> duke klikuar në seancën e përdoruesit të interesuar, duke zgjedhur Shadow nga menyja e kontekstit për personelin që udhëzon se si të përdorin softuerin, nuk është një opsion, u konsiderua një metodë tjetër "druri", domethënë:
1. Gjeni ID-në RDP të seancës:
query user | findstr Administrator
ose:
qwinsta | findstr Administrator
Për më tepër "| findstr Administrator"Ishte i përshtatshëm vetëm kur e dinit se çfarë saktësisht Administrator ju duhet, ose përdorni vetëm pjesën e parë për të parë të gjithë të regjistruar në server.
2. Lidhu me këtë sesion, me kusht që në domen politikat e grupit Opsioni "Konfiguro rregullat e telekomandës për seancat e përdoruesve të Shërbimeve të Desktopit në distancë" zgjidhet me të paktën opsionin "Monitor sesioni me lejen e përdoruesit" (
mstsc /shadow:127
Ju lutemi vini re se lista do të përmbajë vetëm hyrjet e përdoruesve.
E përsëris që pa të drejtat e administratorit do të merrni sa vijon:
Por për korrigjimin paraprak të programit që do të diskutohet, kam përdorur një llogari me të drejta administratori.
II. Programi
Pra, deklarata e problemit: krijimi i një ndërfaqeje të thjeshtë grafike për t'u lidhur me sensin hije të përdoruesit me lejen e tij, duke i dërguar një mesazh përdoruesit. Mjedisi i programimit i zgjedhur është Lazarus.
1. Ne marrim listën e plotë të domenit të përdoruesve "hyrja" - "emri i plotë" nga administratori, ose përsëri përmes tastierës:
wmic useraccount get Name,FullName
askush nuk e ndalon edhe këtë:
wmic useraccount get Name,FullName > c:testusername.txt
Unë do të them menjëherë se ishte Lazarus ai që kishte një problem me përpunimin e këtij skedari, pasi kodimi i tij si parazgjedhje është UCS-2, kështu që thjesht më duhej ta konvertoja manualisht në UTF-8 të rregullt. Ka shumë skeda në strukturën e skedarit, ose më saktë shumë hapësira, të cilat u vendos të përpunohen në mënyrë programore; herët a vonë problemi i kodimit do të zgjidhet dhe skedari do të përditësohet në mënyrë programore.
Pra, ideja është që të kemi një dosje të aksesueshme për përdoruesit e programit, për shembull c:test, në të cilën do të ketë 2 skedarë: i pari me login dhe emri i plotë, i dyti me id_rdp dhe login e përdoruesve. Më pas, ne i përpunojmë këto të dhëna sa më mirë që mundemi :).
Ndërkohë, për t'u lidhur me listën e sesioneve, ne e transferojmë këtë përmbajtje (hyrja dhe emri i plotë) në një grup:
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;
Kërkoj falje për "shumë kodin", pikat e mëposhtme do të jenë më koncize.
2. Duke përdorur të njëjtën metodë nga paragrafi i mëparshëm, ne lexojmë rezultatin e përpunimit të listës në elementin StringGrid, ndërsa unë do të jap një pjesë "të rëndësishme" të kodit:
2.1 Ne marrim listën aktuale të sesioneve të RDP në një skedar:
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 Përpunoni skedarin (tregohen vetëm linja të rëndësishme të kodit):
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. Vetë lidhja direkte duke klikuar në linjën me përdoruesin dhe numrin e sesionit të tij:
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. Janë bërë disa dekorime të tjera, si renditja duke klikuar në butonin e radios dhe mesazhe për përdoruesit ose të gjithë përdoruesit.
→ Mund të shihet kodi i plotë i burimit
III. Duke përdorur AdminLink - ajo që pashë:
AdminLink gjeneron një shkurtore që i referohet vendndodhjes së programit admilaunch.exe, dhe një kopje personale të programit të nisjes AdmiRun.Exe e cila ndodhet në dosjen e përdoruesit, për shembull Vasya, lloji C: Përdoruesit përdorin WINDOWS. Në përgjithësi, jo gjithçka është aq e keqe: mund të luani me të drejtat e hyrjes në skedarin e shkurtoreve dhe të tjerëve për të pastruar ndërgjegjen tuaj të administratorit.
Burimi: www.habr.com