أداة مساعدة لاتصال الظل البشري لغير المسؤول بجلسات مستخدم RDP في WinServer 2012R2

أصبحت المشكلة خلال فترة الحجر الصحي للمؤسسة على النحو التالي: من الضروري حقًا تقليل عدد الزيارات إلى المكاتب من قبل المتخصصين الذين يقدمون الخدمة والاستشارة بشأن برامج التطبيقات، وبصراحة، كثيرًا ما يسيئ المستخدمون استخدام مساعدة المتخصصين دون الرغبة في الخوض في الأمر المشكلة في حد ذاتها، يقولون "سيأتون - سيساعدون - سيفعلون ذلك، لكني سأدخن/أشرب القهوة، وما إلى ذلك". تكون الاستشارة الهاتفية عند مشاركة الخادم أكثر فعالية إذا قمت بعرض الشاشة عن بعد.

أداة مساعدة لاتصال الظل البشري لغير المسؤول بجلسات مستخدم RDP في WinServer 2012R2

بعد "اختراع" دراجتنا، ظهرت معلومات معقولة حول موضوع المقال: RDS Shadow – اتصال الظل لجلسات مستخدم RDP في Windows Server 2012 R2 أو وضع الظل للمستخدم غير المميز في خادم ويندوز أو تفويض إدارة جلسات RDP. كل منهم ينطوي على استخدام وحدة التحكم، حتى مع عناصر الحوار البسيط.

جميع المعلومات الواردة أدناه مخصصة لأولئك الذين يتحمل الانحرافات غير الطبيعية بشكل طبيعي للحصول على النتيجة المرجوة، واختراع أساليب غير ضرورية.
لكي لا "أسحب القطة من ذيلها"، سأبدأ بالآخر: تعمل الدراجة مع المستخدم العادي باستخدام الأداة المساعدة AdmiLink، والذي يرجع الفضل فيه إلى مؤلفه.

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

سأقول على الفور أن Lazarus هو الذي واجه مشكلة في معالجة هذا الملف، نظرًا لأن ترميزه افتراضيًا هو UCS-2، لذلك اضطررت إلى تحويله يدويًا إلى UTF-8 العادي. هناك الكثير من علامات التبويب في بنية الملف، أو بالأحرى الكثير من المسافات، التي تقرر معالجتها برمجيًا، عاجلاً أم آجلاً سيتم حل مشكلة التشفير، وسيتم تحديث الملف برمجياً.

لذا، فإن الفكرة هي أن يكون لديك مجلد يمكن لمستخدمي البرنامج الوصول إليه، على سبيل المثال c:test، حيث سيكون هناك ملفين: الأول مع تسجيل الدخول والاسم الكامل، والثاني مع 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 الموجود في مجلد المستخدم، على سبيل المثال vasya، يكتب ج: مستخدمونفاسياWINDOWS. بشكل عام، ليس كل شيء سيئًا للغاية: يمكنك التلاعب بحقوق الوصول إلى ملف الاختصار وغيره من أجل إراحة ضميرك الإداري.

المصدر: www.habr.com

إضافة تعليق