WinServer 2012R2 бағдарламасындағы RDP пайдаланушы сеанстарына әкімші емес адамның көлеңкелі қосылымына арналған утилита

Кәсіпорынның карантиндік кезеңіндегі мәселе келесідей болды: қолданбалы бағдарламалық қамтамасыз ету бойынша қызмет көрсететін және кеңес беретін мамандардың кеңселерге бару санын барынша азайту керек, ал шынын айтқанда, пайдаланушылар мамандардың көмегіне жиі жүгінгісі келмей, теріс пайдаланады. мәселенің өзінде олар «олар келеді - олар көмектеседі - олар мұны істейді, бірақ мен темекі шегемін/кофе ішемін және т.б.» дейді. Серверді ортақ пайдалану кезінде телефон арқылы кеңес алу қашықтағы экранды қарасаңыз тиімдірек болады.

WinServer 2012R2 бағдарламасындағы RDP пайдаланушы сеанстарына әкімші емес адамның көлеңкелі қосылымына арналған утилита

Біздің велосипедтің «өнертабысы» болғаннан кейін мақаланың тақырыбы бойынша дұрыс ақпарат пайда болды: RDS Shadow – Windows Server 2012 R2 жүйесіндегі RDP пайдаланушы сеанстарына көлеңкелі қосылым немесе Windows серверіндегі артықшылықсыз пайдаланушы көлеңкелі режимі немесе RDP сеанстарын басқаруды тапсыру. Олардың барлығы консольді, тіпті қарапайым диалог элементтерімен де пайдалануды қамтиды.

Төмендегі барлық ақпарат кімге арналған әдеттен тыс бұзылуларға шыдайды қажет емес әдістерді ойлап тауып, қажетті нәтижеге қол жеткізу.
«Мысықты құйрығынан тартпау» үшін мен соңғысынан бастайын: велосипед утилитаны пайдаланатын қарапайым пайдаланушы үшін жұмыс істейді. AdmiLink, бұл үшін оның авторына рахмет.

I. Консоль және көлеңкелі RDP.

бірге қолданғаннан бері Server Manager консолінің әкімші құқықтары -> QuickSessionCollection -> қызықты пайдаланушының сеансын басу арқылы контекстік мәзірден Көлеңке параметрін таңдаңыз. бағдарламалық құралды пайдалануды нұсқайтын персоналға арналған, опция емес, басқа «ағаш» әдісі қарастырылды, атап айтқанда:

1. Сеанстың RDP идентификаторын табыңыз:

query user | findstr Administrator

немесе:

qwinsta | findstr Administrator 

Оның үстіне "| findstr Әкімшісі«Нақты не екенін білгенде ғана ыңғайлы болды Әкімші серверге кіргендердің барлығын көру үшін сізге қажет немесе тек бірінші бөлікті пайдаланыңыз.

WinServer 2012R2 бағдарламасындағы RDP пайдаланушы сеанстарына әкімші емес адамның көлеңкелі қосылымына арналған утилита

2. Доменде болған жағдайда осы сеансқа қосылыңыз топтық саясат "Қашықтағы жұмыс үстелі қызметтерінің пайдаланушы сеанстары үшін қашықтан басқару ережелерін орнату" опциясы кем дегенде "Пайдаланушы рұқсатымен сеансты бақылау" опциясы таңдалғанда таңдалады (көбірек):

mstsc /shadow:127

Тізімде тек пайдаланушы логиндері болатынын ескеріңіз.

Әкімші құқықтарынсыз келесіні алатыныңызды қайталаймын:

WinServer 2012R2 бағдарламасындағы RDP пайдаланушы сеанстарына әкімші емес адамның көлеңкелі қосылымына арналған утилита

Бірақ талқыланатын бағдарламаны алдын ала жөндеу үшін мен әкімші құқығы бар тіркелгіні қолдандым.

II. Бағдарлама

Мәселен, мәселенің мәлімдемесі: пайдаланушыға оның рұқсатымен көлеңкелі сезіммен қосылу үшін қарапайым графикалық интерфейсті құру, пайдаланушыға хабарлама жіберу. Таңдалған бағдарламалау ортасы - 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. Радио түймені басу арқылы сұрыптау және пайдаланушыға немесе барлық пайдаланушыларға хабарлар сияқты тағы бірнеше әшекейлер жасалды.

WinServer 2012R2 бағдарламасындағы RDP пайдаланушы сеанстарына әкімші емес адамның көлеңкелі қосылымына арналған утилита

→ Толық бастапқы кодты көруге болады осында

III. AdminLink пайдалану - мен көргенім:

AdminLink қызметтік бағдарламаның орнына сілтеме жасайтын таңбашаны жасайды admilaunch.exe, және іске қосу утилитасының жеке көшірмесі AdmiRun.Exe ол, мысалы, пайдаланушы қалтасында орналасқан vasya, түрі C: Пайдаланушылар WINDOWS. Жалпы алғанда, бәрі соншалықты жаман емес: сіз өзіңіздің әкімші ар-ұжданыңызды тазарту үшін төте жол файлына және басқаларға кіру құқықтарымен ойнай аласыз.

Ақпарат көзі: www.habr.com

пікір қалдыру