Masalah semasa tempoh kuarantin perusahaan menjadi seperti berikut: adalah benar-benar perlu untuk meminimumkan bilangan lawatan ke pejabat oleh pakar yang membuat servis dan perundingan mengenai perisian aplikasi, dan secara terus terang, pengguna sering menyalahgunakan bantuan pakar tanpa mahu menyelidikinya. isu itu sendiri, mereka berkata "mereka akan datang - mereka akan membantu - mereka akan melakukannya, tetapi saya akan merokok/minum kopi, dll." Perundingan telefon semasa berkongsi pelayan adalah lebih berkesan jika anda melihat skrin jauh.
Selepas "ciptaan" basikal kami, maklumat waras mengenai topik artikel itu muncul:
Semua maklumat di bawah adalah bertujuan untuk mereka yang bertolak ansur dengan penyelewengan yang tidak normal secara normal untuk mendapatkan hasil yang diingini, mencipta kaedah yang tidak perlu.
Untuk tidak "menarik ekor kucing", saya akan mulakan dengan yang terakhir: basikal berfungsi untuk pengguna biasa yang menggunakan utiliti
I. Konsol dan RDP bayangan.
Sejak digunakan dengan hak pentadbir konsol Pengurus Pelayan -> QuickSessionCollection -> dengan mengklik pada sesi pengguna yang diminati, memilih Shadow dari menu konteks untuk kakitangan yang mengarahkan cara menggunakan perisian, bukan pilihan, kaedah "kayu" lain telah dipertimbangkan, iaitu:
1. Ketahui id RDP sesi:
query user | findstr Administrator
atau:
qwinsta | findstr Administrator
Lebih-lebih lagi"| findstr Pentadbir"Ia hanya mudah apabila anda tahu apa sebenarnya pentadbir anda perlukan, atau gunakan hanya bahagian pertama untuk melihat semua orang log masuk ke pelayan.
2. Sambung ke sesi ini, dengan syarat dalam domain dasar kumpulan Pilihan "Sediakan peraturan kawalan jauh untuk sesi Perkhidmatan Desktop Jauh pengguna" dipilih dengan sekurang-kurangnya pilihan "Pantau sesi dengan kebenaran pengguna" dipilih (
mstsc /shadow:127
Sila ambil perhatian bahawa senarai hanya akan mengandungi log masuk pengguna.
Saya ulangi bahawa tanpa hak pentadbir anda akan mendapat perkara berikut:
Tetapi untuk penyahpepijatan awal program yang akan dibincangkan, saya menggunakan akaun dengan hak pentadbir.
II. Program
Jadi penyataan masalah: mencipta beberapa antara muka grafik mudah untuk menyambung kepada deria bayang pengguna dengan kebenarannya, menghantar mesej kepada pengguna. Persekitaran pengaturcaraan yang dipilih ialah Lazarus.
1. Kami mendapat senarai domain penuh pengguna "log masuk" - "nama penuh" daripada pentadbir, atau sekali lagi melalui konsol:
wmic useraccount get Name,FullName
tiada siapa yang melarang walaupun ini:
wmic useraccount get Name,FullName > c:testusername.txt
Saya akan katakan dengan serta-merta bahawa Lazarus yang mempunyai masalah dengan memproses fail ini, kerana secara lalai pengekodannya ialah UCS-2, jadi saya hanya perlu menukarnya secara manual kepada UTF-8 biasa. Terdapat banyak tab dalam struktur fail, atau lebih tepatnya banyak ruang, yang diputuskan untuk diproses secara pemrograman; lambat laun masalah pengekodan akan diselesaikan, dan fail akan dikemas kini secara pemrograman.
Jadi, ideanya adalah untuk mempunyai folder yang boleh diakses oleh pengguna program, contohnya c:test, di mana akan ada 2 fail: yang pertama dengan log masuk dan nama penuh, yang kedua dengan id_rdp dan log masuk pengguna. Seterusnya, kami memproses data ini sebaik mungkin :).
Sementara itu, untuk mengaitkan dengan senarai sesi, kami memindahkan kandungan (log masuk dan nama penuh) ini kepada tatasusunan:
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;
Saya memohon maaf atas "banyak kod", perkara berikut akan menjadi lebih ringkas.
2. Menggunakan kaedah yang sama dari perenggan sebelumnya, kami membaca hasil pemprosesan senarai ke dalam elemen StringGrid, sementara saya akan memberikan sekeping kod "penting":
2.1 Kami menerima senarai semasa sesi RDP dalam fail:
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 Proses fail (hanya baris kod yang penting ditunjukkan):
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. Sambungan terus sendiri dengan mengklik pada baris dengan pengguna dan nombor sesinya:
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. Beberapa lagi hiasan telah dibuat, seperti mengisih dengan mengklik butang radio dan mesej kepada pengguna atau semua pengguna.
β Kod sumber penuh boleh dilihat
III. Menggunakan AdminLink - apa yang saya lihat:
AdminLink menjana pintasan yang merujuk lokasi utiliti admilaunch.exe, dan salinan peribadi utiliti pelancaran AdmiRun.Exe yang terletak dalam folder pengguna, sebagai contoh Vasya, taip C:UsersvasyaWINDOWS. Secara umum, tidak semuanya begitu buruk: anda boleh bermain-main dengan hak akses kepada fail pintasan dan lain-lain untuk membersihkan hati nurani pentadbir anda sendiri.
Sumber: www.habr.com