ยูทิลิตี้สำหรับการเชื่อมต่อเงาของมนุษย์ของผู้ที่ไม่ใช่ผู้ดูแลระบบกับเซสชันผู้ใช้ RDP ใน WinServer 2012R2

ปัญหาในช่วงระยะเวลากักกันขององค์กรมีดังนี้: จำเป็นอย่างยิ่งที่จะต้องลดจำนวนการเยี่ยมชมสำนักงานโดยผู้เชี่ยวชาญที่ให้บริการและให้คำปรึกษาเกี่ยวกับแอพพลิเคชั่นซอฟต์แวร์และพูดตามตรงผู้ใช้มักจะละเมิดความช่วยเหลือจากผู้เชี่ยวชาญโดยไม่ต้องการเจาะลึก ปัญหานั้นเอง พวกเขาบอกว่า “จะมา - จะช่วย - จะทำ แต่ฉันจะสูบบุหรี่/ดื่มกาแฟ ฯลฯ” การให้คำปรึกษาทางโทรศัพท์เมื่อแชร์เซิร์ฟเวอร์จะมีประสิทธิภาพมากขึ้นหากคุณดูหน้าจอระยะไกล

ยูทิลิตี้สำหรับการเชื่อมต่อเงาของมนุษย์ของผู้ที่ไม่ใช่ผู้ดูแลระบบกับเซสชันผู้ใช้ RDP ใน WinServer 2012R2

หลังจากการ "ประดิษฐ์" จักรยานของเรา ข้อมูลที่มีสติในหัวข้อของบทความก็ปรากฏขึ้น: RDS Shadow – การเชื่อมต่อเงากับเซสชันผู้ใช้ RDP ใน Windows Server 2012 R2 หรือ โหมดเงาผู้ใช้ที่ไม่มีสิทธิพิเศษในเซิร์ฟเวอร์ windows หรือ มอบหมายการจัดการเซสชัน RDP. ทั้งหมดเกี่ยวข้องกับการใช้คอนโซล แม้ว่าจะมีองค์ประกอบของบทสนทนาง่ายๆ ก็ตาม

ข้อมูลด้านล่างทั้งหมดมีไว้สำหรับผู้ที่ อดทนต่อความวิปริตที่ผิดปกติได้ตามปกติ เพื่อให้ได้ผลลัพธ์ตามที่ต้องการโดยคิดค้นวิธีการที่ไม่จำเป็น
เพื่อไม่ให้ "ดึงหางแมว" ฉันจะเริ่มด้วยอันสุดท้าย: จักรยานใช้งานได้สำหรับผู้ใช้ทั่วไปโดยใช้ยูทิลิตี้ แอดมินลิงค์ซึ่งต้องขอบคุณผู้เขียน

I. คอนโซลและเงา RDP

ตั้งแต่ใช้กับ สิทธิ์ผู้ดูแลระบบของคอนโซล Server Manager -> QuickSessionCollection -> โดยการคลิกที่เซสชันของผู้ใช้ที่สนใจ เลือก Shadow จากเมนูบริบท สำหรับบุคลากรที่สอนการใช้งานซอฟต์แวร์ไม่ใช่ทางเลือก แต่มีการพิจารณาวิธี "ไม้" อีกวิธีหนึ่ง ได้แก่:

1. ค้นหารหัส RDP ของเซสชัน:

query user | findstr Administrator

หรือ:

qwinsta | findstr Administrator 

นอกจากนี้ "| ผู้ดูแลระบบ findstr“มันจะสะดวกก็ต่อเมื่อคุณรู้ว่าอะไรกันแน่ ผู้บริหาร คุณต้องการหรือใช้เฉพาะส่วนแรกเพื่อดูทุกคนที่เข้าสู่ระบบเซิร์ฟเวอร์

ยูทิลิตี้สำหรับการเชื่อมต่อเงาของมนุษย์ของผู้ที่ไม่ใช่ผู้ดูแลระบบกับเซสชันผู้ใช้ RDP ใน WinServer 2012R2

2. เชื่อมต่อกับเซสชันนี้ โดยมีเงื่อนไขว่าอยู่ในโดเมน นโยบายกลุ่ม มีการเลือกตัวเลือก "ตั้งค่ากฎการควบคุมระยะไกลสำหรับเซสชันผู้ใช้ของบริการเดสก์ท็อประยะไกล" โดยเลือกตัวเลือก "ตรวจสอบเซสชันที่ได้รับอนุญาตจากผู้ใช้" เป็นอย่างน้อย (ขึ้น):

mstsc /shadow:127

โปรดทราบว่ารายการจะมีเฉพาะการเข้าสู่ระบบของผู้ใช้เท่านั้น

ฉันขอย้ำอีกครั้งว่าหากไม่มีสิทธิ์ของผู้ดูแลระบบคุณจะได้รับสิ่งต่อไปนี้:

ยูทิลิตี้สำหรับการเชื่อมต่อเงาของมนุษย์ของผู้ที่ไม่ใช่ผู้ดูแลระบบกับเซสชันผู้ใช้ RDP ใน WinServer 2012R2

แต่สำหรับการดีบักเบื้องต้นของโปรแกรมที่จะกล่าวถึง ฉันใช้บัญชีที่มีสิทธิ์ของผู้ดูแลระบบ

ครั้งที่สอง โปรแกรม

ดังนั้นคำชี้แจงปัญหา: การสร้างอินเทอร์เฟซแบบกราฟิกที่เรียบง่ายเพื่อเชื่อมต่อกับความรู้สึกด้านเงาของผู้ใช้โดยได้รับอนุญาตจากเขา โดยส่งข้อความถึงผู้ใช้ สภาพแวดล้อมการเขียนโปรแกรมที่เลือกคือ Lazarus

1. เราได้รับรายชื่อโดเมนทั้งหมดของผู้ใช้ "เข้าสู่ระบบ" - "ชื่อเต็ม" จากผู้ดูแลระบบหรืออีกครั้งผ่านคอนโซล:

wmic useraccount get Name,FullName 

ไม่มีใครห้ามแม้แต่สิ่งนี้:

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

ฉันจะบอกทันทีว่าเป็นลาซารัสที่มีปัญหาในการประมวลผลไฟล์นี้ เนื่องจากโดยค่าเริ่มต้นการเข้ารหัสคือ UCS-2 ดังนั้นฉันจึงต้องแปลงเป็น UTF-8 ปกติด้วยตนเอง โครงสร้างไฟล์มีแท็บจำนวนมากหรือมีช่องว่างจำนวนมากซึ่งตัดสินใจโดยทางโปรแกรมไม่ช้าก็เร็วปัญหาการเข้ารหัสจะได้รับการแก้ไขและไฟล์จะได้รับการอัปเดตโดยทางโปรแกรม

ดังนั้นแนวคิดคือการให้ผู้ใช้โปรแกรมสามารถเข้าถึงโฟลเดอร์ได้เช่น c:test ซึ่งจะมี 2 ไฟล์: ไฟล์แรกที่มีการเข้าสู่ระบบและชื่อเต็ม ไฟล์ที่สองมี id_rdp และการเข้าสู่ระบบของผู้ใช้ ต่อไป เราจะประมวลผลข้อมูลนี้อย่างดีที่สุดเท่าที่จะทำได้ :)

ในระหว่างนี้ เพื่อเชื่อมโยงกับรายการเซสชัน เราจะถ่ายโอนเนื้อหา (การเข้าสู่ระบบและชื่อเต็ม) นี้ไปยังอาร์เรย์:

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;

ฉันขอโทษสำหรับ "รหัสจำนวนมาก" ประเด็นต่อไปนี้จะกระชับมากขึ้น

2. ด้วยการใช้วิธีเดียวกันจากย่อหน้าก่อนหน้า เราจะอ่านผลลัพธ์ของการประมวลผลรายการลงในองค์ประกอบ StringGrid ในขณะที่ฉันจะให้โค้ดที่ "สำคัญ":

2.1 เราได้รับรายการเซสชัน RDP ปัจจุบันในไฟล์:

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 ประมวลผลไฟล์ (ระบุเฉพาะบรรทัดที่สำคัญของโค้ด):

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. เชื่อมต่อโดยตรงโดยคลิกที่บรรทัดกับผู้ใช้และหมายเลขเซสชัน:

  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. มีการตกแต่งเพิ่มเติมอีกสองสามรายการ เช่น การเรียงลำดับโดยการคลิกที่ปุ่มตัวเลือก และข้อความถึงผู้ใช้หรือผู้ใช้ทั้งหมด

ยูทิลิตี้สำหรับการเชื่อมต่อเงาของมนุษย์ของผู้ที่ไม่ใช่ผู้ดูแลระบบกับเซสชันผู้ใช้ RDP ใน WinServer 2012R2

→ สามารถดูซอร์สโค้ดแบบเต็มได้ ที่นี่

สาม. ใช้ AdminLink - สิ่งที่ฉันเห็น:

AdminLink สร้างทางลัดที่อ้างอิงตำแหน่งของยูทิลิตี้ admilaunch.exeและสำเนาส่วนตัวของยูทิลิตี้การเรียกใช้งาน AdmiRun.Exe ซึ่งอยู่ในโฟลเดอร์ของผู้ใช้ เป็นต้น วาสยา, พิมพ์ C:UsersvasyaWINDOWS. โดยทั่วไปแล้ว ไม่ใช่ทุกสิ่งที่แย่นัก: คุณสามารถลองใช้สิทธิ์ในการเข้าถึงไฟล์ทางลัดและอื่น ๆ เพื่อล้างความรู้สึกผิดชอบชั่วดีของผู้ดูแลระบบของคุณเอง

ที่มา: will.com

เพิ่มความคิดเห็น