Utilitas untuk koneksi bayangan manusia non-administrator ke sesi pengguna RDP di WinServer 2012R2

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.

Utilitas untuk koneksi bayangan manusia non-administrator ke sesi pengguna RDP di WinServer 2012R2

Setelah β€œpenemuan” sepeda kami, informasi yang masuk akal tentang topik artikel muncul: RDS Shadow – koneksi bayangan ke sesi pengguna RDP di Windows Server 2012 R2 ΠΈΠ»ΠΈ Mode bayangan pengguna tanpa hak istimewa di server windows ΠΈΠ»ΠΈ Mendelegasikan manajemen sesi RDP. Semuanya melibatkan penggunaan konsol, bahkan dengan unsur dialog sederhana.

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 AdminLink, untuk itu terima kasih kepada penulisnya.

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.

Utilitas untuk koneksi bayangan manusia non-administrator ke sesi pengguna RDP di WinServer 2012R2

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 (lebih):

mstsc /shadow:127

Harap dicatat bahwa daftar ini hanya akan berisi login pengguna.

Saya ulangi bahwa tanpa hak admin Anda akan mendapatkan yang berikut:

Utilitas untuk koneksi bayangan manusia non-administrator ke sesi pengguna RDP di WinServer 2012R2

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.

Utilitas untuk koneksi bayangan manusia non-administrator ke sesi pengguna RDP di WinServer 2012R2

β†’ Kode sumber lengkap dapat dilihat di sini

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

Tambah komentar