ปัญหาในช่วงระยะเวลากักกันขององค์กรมีดังนี้: จำเป็นอย่างยิ่งที่จะต้องลดจำนวนการเยี่ยมชมสำนักงานโดยผู้เชี่ยวชาญที่ให้บริการและให้คำปรึกษาเกี่ยวกับแอพพลิเคชั่นซอฟต์แวร์และพูดตามตรงผู้ใช้มักจะละเมิดความช่วยเหลือจากผู้เชี่ยวชาญโดยไม่ต้องการเจาะลึก ปัญหานั้นเอง พวกเขาบอกว่า “จะมา - จะช่วย - จะทำ แต่ฉันจะสูบบุหรี่/ดื่มกาแฟ ฯลฯ” การให้คำปรึกษาทางโทรศัพท์เมื่อแชร์เซิร์ฟเวอร์จะมีประสิทธิภาพมากขึ้นหากคุณดูหน้าจอระยะไกล
หลังจากการ "ประดิษฐ์" จักรยานของเรา ข้อมูลที่มีสติในหัวข้อของบทความก็ปรากฏขึ้น:
ข้อมูลด้านล่างทั้งหมดมีไว้สำหรับผู้ที่ อดทนต่อความวิปริตที่ผิดปกติได้ตามปกติ เพื่อให้ได้ผลลัพธ์ตามที่ต้องการโดยคิดค้นวิธีการที่ไม่จำเป็น
เพื่อไม่ให้ "ดึงหางแมว" ฉันจะเริ่มด้วยอันสุดท้าย: จักรยานใช้งานได้สำหรับผู้ใช้ทั่วไปโดยใช้ยูทิลิตี้
I. คอนโซลและเงา RDP
ตั้งแต่ใช้กับ สิทธิ์ผู้ดูแลระบบของคอนโซล Server Manager -> QuickSessionCollection -> โดยการคลิกที่เซสชันของผู้ใช้ที่สนใจ เลือก Shadow จากเมนูบริบท สำหรับบุคลากรที่สอนการใช้งานซอฟต์แวร์ไม่ใช่ทางเลือก แต่มีการพิจารณาวิธี "ไม้" อีกวิธีหนึ่ง ได้แก่:
1. ค้นหารหัส RDP ของเซสชัน:
query user | findstr Administrator
หรือ:
qwinsta | findstr Administrator
นอกจากนี้ "| ผู้ดูแลระบบ findstr“มันจะสะดวกก็ต่อเมื่อคุณรู้ว่าอะไรกันแน่ ผู้บริหาร คุณต้องการหรือใช้เฉพาะส่วนแรกเพื่อดูทุกคนที่เข้าสู่ระบบเซิร์ฟเวอร์
2. เชื่อมต่อกับเซสชันนี้ โดยมีเงื่อนไขว่าอยู่ในโดเมน นโยบายกลุ่ม มีการเลือกตัวเลือก "ตั้งค่ากฎการควบคุมระยะไกลสำหรับเซสชันผู้ใช้ของบริการเดสก์ท็อประยะไกล" โดยเลือกตัวเลือก "ตรวจสอบเซสชันที่ได้รับอนุญาตจากผู้ใช้" เป็นอย่างน้อย (
mstsc /shadow:127
โปรดทราบว่ารายการจะมีเฉพาะการเข้าสู่ระบบของผู้ใช้เท่านั้น
ฉันขอย้ำอีกครั้งว่าหากไม่มีสิทธิ์ของผู้ดูแลระบบคุณจะได้รับสิ่งต่อไปนี้:
แต่สำหรับการดีบักเบื้องต้นของโปรแกรมที่จะกล่าวถึง ฉันใช้บัญชีที่มีสิทธิ์ของผู้ดูแลระบบ
ครั้งที่สอง โปรแกรม
ดังนั้นคำชี้แจงปัญหา: การสร้างอินเทอร์เฟซแบบกราฟิกที่เรียบง่ายเพื่อเชื่อมต่อกับความรู้สึกด้านเงาของผู้ใช้โดยได้รับอนุญาตจากเขา โดยส่งข้อความถึงผู้ใช้ สภาพแวดล้อมการเขียนโปรแกรมที่เลือกคือ 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. มีการตกแต่งเพิ่มเติมอีกสองสามรายการ เช่น การเรียงลำดับโดยการคลิกที่ปุ่มตัวเลือก และข้อความถึงผู้ใช้หรือผู้ใช้ทั้งหมด
→ สามารถดูซอร์สโค้ดแบบเต็มได้
สาม. ใช้ AdminLink - สิ่งที่ฉันเห็น:
AdminLink สร้างทางลัดที่อ้างอิงตำแหน่งของยูทิลิตี้ admilaunch.exeและสำเนาส่วนตัวของยูทิลิตี้การเรียกใช้งาน AdmiRun.Exe ซึ่งอยู่ในโฟลเดอร์ของผู้ใช้ เป็นต้น วาสยา, พิมพ์ C:UsersvasyaWINDOWS. โดยทั่วไปแล้ว ไม่ใช่ทุกสิ่งที่แย่นัก: คุณสามารถลองใช้สิทธิ์ในการเข้าถึงไฟล์ทางลัดและอื่น ๆ เพื่อล้างความรู้สึกผิดชอบชั่วดีของผู้ดูแลระบบของคุณเอง
ที่มา: will.com