Utilitas kanggo sambungan bayangan manungsa non-administrator menyang sesi pangguna RDP ing WinServer 2012R2

Masalah sajrone periode karantina perusahaan dadi ing ngisor iki: pancene kudu nyilikake jumlah kunjungan menyang kantor dening spesialis sing nglayani lan konsultasi babagan piranti lunak aplikasi, lan terus terang, pangguna asring nyiksa bantuan saka spesialis tanpa pengin nyelidiki. masalah kasebut dhewe, dheweke ujar "bakal teka - bakal nulungi - bakal ditindakake, nanging aku bakal ngrokok / ngombe kopi, lsp." Konsultasi telpon nalika nuduhake server luwih efektif yen sampeyan ndeleng layar remot.

Utilitas kanggo sambungan bayangan manungsa non-administrator menyang sesi pangguna RDP ing WinServer 2012R2

Sawise "penemuan" sepeda kita, informasi waras babagan topik artikel kasebut muncul: RDS Shadow - sambungan bayangan menyang sesi pangguna RDP ing Windows Server 2012 R2 utawa Mode bayangan pangguna sing ora duwe hak istimewa ing server windows utawa Delegasi manajemen sesi RDP. Kabeh mau melu nggunakake console, malah karo unsur saka dialog prasaja.

Kabeh informasi ing ngisor iki dimaksudakΓ© kanggo wong-wong sing tolerates perversions abnormal biasane kanggo entuk asil sing dikarepake, nggawe cara sing ora perlu.
Supaya ora "narik kucing kanthi buntut", aku bakal miwiti karo sing pungkasan: mancal bisa digunakake kanggo pangguna rata-rata nggunakake sarana AdmiLink, kang thanks kanggo penulis sawijining.

I. Console lan bayangan RDP.

Wiwit digunakake karo hak administrator saka konsol Server Manager -> QuickSessionCollection -> kanthi ngeklik sesi pangguna sing dikarepake, milih Shadow saka menu konteks kanggo personel instructing carane nggunakake piranti lunak, ora dadi pilihan, metode "kayu" liyane dianggep, yaiku:

1. Temokake id RDP sesi:

query user | findstr Administrator

utawa:

qwinsta | findstr Administrator 

opo maneh"| Findstr Administrator"Iku mung trep nalika ngerti apa persis Administrator sampeyan kudu, utawa nggunakake mung bagean pisanan kanggo ndeleng everyone mlebu ing server.

Utilitas kanggo sambungan bayangan manungsa non-administrator menyang sesi pangguna RDP ing WinServer 2012R2

2. Sambungake menyang sesi iki, kasedhiya ing domain kawicaksanan klompok Opsi "Setel aturan kontrol remot kanggo sesi Layanan Desktop Jarak Jauh pangguna" dipilih kanthi paling ora pilihan "Sesi monitor kanthi ijin pangguna" sing dipilih (luwih akeh info):

mstsc /shadow:127

Wigati dimangerteni manawa dhaptar kasebut mung ngemot login pangguna.

Aku mbaleni manawa tanpa hak admin sampeyan bakal entuk ing ngisor iki:

Utilitas kanggo sambungan bayangan manungsa non-administrator menyang sesi pangguna RDP ing WinServer 2012R2

Nanging kanggo debugging awal program sing bakal dibahas, aku nggunakake akun kanthi hak administrator.

II. Program

Dadi statement masalah: nggawe sawetara antarmuka grafis prasaja kanggo nyambung menyang pangertèn bayangan pangguna karo ijin, ngirim pesen kanggo pangguna. Lingkungan pemrograman sing dipilih yaiku Lazarus.

1. Kita entuk dhaptar domain lengkap pangguna "login" - "jeneng lengkap" saka administrator, utawa maneh liwat konsol:

wmic useraccount get Name,FullName 

ora ana sing nglarang iki:

wmic useraccount get Name,FullName > c:testusername.txt

Aku bakal langsung ngomong yen Lazarus sing duwe masalah karo ngolah file iki, amarga kanthi standar enkoding UCS-2, mula aku kudu ngowahi kanthi manual menyang UTF-8 biasa. Ana akeh tab ing struktur file, utawa luwih akeh spasi, sing diputusake kanggo diproses kanthi program; cepet utawa mengko masalah enkoding bakal ditanggulangi, lan file kasebut bakal dianyari kanthi program.

Dadi, ide kasebut yaiku nduwe folder sing bisa diakses pangguna program, contone c:test, sing bakal ana 2 file: sing pertama nganggo login lan jeneng lengkap, sing nomer loro nganggo id_rdp lan login pangguna. Sabanjure, kita ngolah data iki kanthi paling apik :).

Ing sawetoro wektu, kanggo nggandhengake karo dhaptar sesi, kita nransfer isi (login lan jeneng lengkap) iki menyang 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;

Aku njaluk ngapura kanggo "akeh kode", TCTerms ing ngisor iki bakal luwih ringkes.

2. Nggunakake metode sing padha saka paragraf sadurunge, kita maca asil pangolahan dhaptar menyang unsur StringGrid, nalika aku bakal menehi potongan kode "penting":

2.1 Kita nampa dhaptar sesi RDP saiki ing 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 Proses file (mung baris kode penting sing dituduhake):

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 langsung dhewe kanthi ngeklik baris karo pangguna lan nomer sesi:

  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. A saperangan liyane paesan wis digawe, kayata ngurutake kanthi ngeklik ing radiobutton, lan pesen kanggo pangguna utawa kabeh kedhaftar.

Utilitas kanggo sambungan bayangan manungsa non-administrator menyang sesi pangguna RDP ing WinServer 2012R2

β†’ Kode sumber lengkap bisa dideleng kene

III. Nggunakake AdminLink - apa sing dakdeleng:

AdminLink nggawe trabasan sing nuduhake lokasi sarana admilaunch.exe, lan salinan pribadi sarana peluncuran AdmiRun.Exe kang dumunung ing folder pangguna, contone, vasya, jinis C:UsvasyaWINDOWS. UmumΓ©, ora kabeh dadi ala: sampeyan bisa muter-muter kanthi hak akses menyang file trabasan lan liya-liyane kanggo ngresiki kalbu admin sampeyan dhewe.

Source: www.habr.com

Add a comment