Masalah selama masa karantina perusahaan adalah sebagai berikut: sangat perlu untuk meminimalkan jumlah kunjungan ke kantor oleh spesialis yang melayani dan berkonsultasi tentang perangkat lunak aplikasi, dan sejujurnya, pengguna sering menyalahgunakan bantuan spesialis tanpa ingin menyelidikinya. masalahnya sendiri, mereka bilang βmereka akan datang - mereka akan membantu - mereka akan melakukannya, tapi saya akan merokok/minum kopi, dll.β Konsultasi melalui telepon saat berbagi server lebih efektif jika Anda melihat layar jarak jauh.
Setelah βpenemuanβ sepeda kami, informasi yang masuk akal tentang topik artikel muncul:
Semua informasi di bawah ini ditujukan bagi mereka yang mentolerir penyimpangan abnormal secara normal untuk mendapatkan hasil yang diinginkan, menciptakan metode yang tidak perlu.
Agar tidak βmenarik ekor kucingβ, saya akan mulai dengan yang terakhir: sepeda berfungsi untuk rata-rata pengguna yang menggunakan utilitas
I. Konsol dan RDP bayangan.
Sejak digunakan dengan hak administrator konsol Server Manager -> QuickSessionCollection -> dengan mengklik sesi pengguna yang diinginkan, memilih Shadow dari menu konteks untuk personel yang menginstruksikan cara menggunakan perangkat lunak, bukanlah suatu pilihan, metode βkayuβ lain telah dipertimbangkan, yaitu:
1. Cari tahu id RDP sesi tersebut:
query user | findstr Administrator
atau:
qwinsta | findstr Administrator
Lebih-lebih lagi "| menemukan AdministratorβAkan lebih mudah jika Anda tahu apa sebenarnya administrator Anda perlu, atau gunakan hanya bagian pertama untuk melihat semua orang masuk ke server.
2. Hubungkan ke sesi ini, asalkan dalam domain kebijakan kelompok Opsi "Siapkan aturan kendali jarak jauh untuk sesi pengguna Layanan Desktop Jarak Jauh" dipilih dengan setidaknya opsi "Pantau sesi dengan izin pengguna" dipilih (
mstsc /shadow:127
Harap dicatat bahwa daftar ini hanya akan berisi login pengguna.
Saya ulangi bahwa tanpa hak admin Anda akan mendapatkan yang berikut:
Namun untuk debugging awal program yang akan dibahas, saya menggunakan akun dengan hak administrator.
II. Program
Jadi pernyataan masalahnya: membuat beberapa antarmuka grafis sederhana untuk terhubung ke indra bayangan pengguna dengan izinnya, mengirimkan pesan ke pengguna. Lingkungan pemrograman yang dipilih adalah Lazarus.
1. Kami mendapatkan daftar lengkap domain pengguna "login" - "nama lengkap" dari administrator, atau melalui konsol:
wmic useraccount get Name,FullName
tidak ada yang melarang bahkan ini:
wmic useraccount get Name,FullName > c:testusername.txt
Saya akan langsung mengatakan bahwa Lazarus-lah yang mengalami masalah dalam memproses file ini, karena secara default pengkodeannya adalah UCS-2, jadi saya hanya perlu mengonversinya secara manual ke UTF-8 biasa. Ada banyak tab dalam struktur file, atau lebih tepatnya banyak ruang, yang diputuskan untuk diproses secara terprogram; cepat atau lambat masalah pengkodean akan terpecahkan, dan file akan diperbarui secara terprogram.
Jadi, idenya adalah untuk memiliki folder yang dapat diakses oleh pengguna program, misalnya c:test, yang di dalamnya akan ada 2 file: yang pertama dengan login dan nama lengkap, yang kedua dengan id_rdp dan login pengguna. Selanjutnya data ini kami proses sebaik mungkin :).
Sementara itu, untuk mengaitkan dengan daftar sesi, kami mentransfer konten ini (login dan nama lengkap) ke dalam 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;
Saya mohon maaf atas βbanyak kodenyaβ, poin-poin berikut ini akan lebih ringkas.
2. Dengan menggunakan cara yang sama pada paragraf sebelumnya, kita membaca hasil pengolahan list ke dalam elemen StringGrid, sedangkan saya akan memberikan potongan kode yang βpentingβ:
2.1 Kami menerima daftar sesi RDP saat ini dalam sebuah 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 Memproses file (hanya baris kode penting yang 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. Koneksi langsung sendiri dengan mengklik baris dengan pengguna dan nomor 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 dekorasi lagi telah dibuat, seperti pengurutan dengan mengklik tombol radio, dan pesan ke pengguna atau semua pengguna.
β Kode sumber lengkap dapat dilihat
AKU AKU AKU. Menggunakan AdminLink - apa yang saya lihat:
AdminLink menghasilkan pintasan yang mereferensikan lokasi utilitas admilaunch.exe, dan salinan pribadi dari utilitas peluncuran AdmiRun.Exe yang terletak di folder pengguna, misalnya Vasya, Tipe C:PenggunavasyaWINDOWS. Secara umum, tidak semuanya buruk: Anda dapat bermain-main dengan hak akses ke file pintasan dan lainnya untuk membersihkan hati nurani admin Anda sendiri.
Sumber: www.habr.com