WinServer 2012R2деги RDP колдонуучу сеанстарына администратор эмес адамдын көмүскө туташуу үчүн утилита

Ишкананын карантин учурундагы көйгөйү төмөндөгүдөй болуп калды: колдонмо программалык камсыздоо боюнча тейлөөчү жана консультация берген адистердин кеңселерге баруу санын минималдаштыруу керек, жана чынын айтканда, колдонуучулар көп учурда адистердин жардамынан кыянаттык менен пайдаланышат. маселенин өзү, алар "алар келишет - алар жардам беришет - алар муну жасайт, бирок мен тамеки тартам/кофе ичем ж.б.у." дешет. Серверди бөлүшүүдө телефон аркылуу кеңешүү, эгерде сиз алыстан экранды көрсөңүз, натыйжалуураак болот.

WinServer 2012R2деги RDP колдонуучу сеанстарына администратор эмес адамдын көмүскө туташуу үчүн утилита

Биздин велосипедди "ойлоп табуудан" кийин, макаланын темасы боюнча акылга сыярлык маалымат пайда болду: RDS Shadow – Windows Server 2012 R2деги RDP колдонуучу сессияларына көмүскө туташуу же Windows серверинде артыкчылыксыз колдонуучу көлөкө режими же RDP сессияларын башкарууну өткөрүп берүү. Алардын баары жөнөкөй диалогдун элементтери менен да консолду колдонууну камтыйт.

Төмөндөгү бардык маалыматтар кимдир бирөөлөр үчүн арналган адаттан тыш бузукулуктарга чыдайт керексиз ыкмаларды ойлоп таап, каалаган натыйжаны алуу.
"Мышыкты куйругу менен тартпаш үчүн" мен акыркысынан баштайын: велосипед утилитаны колдонгон жөнөкөй колдонуучу үчүн иштейт AdmiLink, бул үчүн анын авторуна рахмат.

I. Консол жана көлөкө RDP.

менен колдонгондон бери Server Manager консолунун администратордук укуктары -> QuickSessionCollection -> кызыккан колдонуучунун сессиясын чыкылдатуу менен, контексттик менюдан Shadow тандаңыз программалык камсыздоону колдонууну үйрөтүүчү кызматкерлер үчүн, вариант эмес, башка "жыгач" ыкмасы каралып, атап айтканда:

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

query user | findstr Administrator

же:

qwinsta | findstr Administrator 

Мындан тышкары "| findstr Администратор"Бул эмнени так билгенде гана ыңгайлуу болду Administrator сизге керек, же бардыгынын серверге киргенин көрүү үчүн биринчи бөлүгүн гана колдонуңуз.

WinServer 2012R2деги RDP колдонуучу сеанстарына администратор эмес адамдын көмүскө туташуу үчүн утилита

2. Доменде болсо, бул сессияга туташуу топтун саясаты "Алыскы иштакта кызматтарынын колдонуучу сеанстары үчүн алыстан башкаруу эрежелерин орнотуу" опциясы жок дегенде "Колдонуучунун уруксаты менен сеансты көзөмөлдөө" опциясы тандалган (дагы):

mstsc /shadow:127

Тизмеде колдонуучунун логиндери гана камтыларын эске алыңыз.

Кайталап айтам, администратордук укуктарсыз сиз төмөнкүлөрдү аласыз:

WinServer 2012R2деги RDP колдонуучу сеанстарына администратор эмес адамдын көмүскө туташуу үчүн утилита

Бирок талкуулана турган программанын алдын ала мүчүлүштүктөрүн оңдоо үчүн мен администратордук укуктарга ээ каттоо эсебин колдондум.

II. Программа

Ошентип, көйгөйдүн билдирүүсү: колдонуучуга билдирүү жөнөтүү, анын уруксаты менен колдонуучунун көлөкө сезимине туташуу үчүн жөнөкөй графикалык интерфейсти түзүү. Тандалган программалоо чөйрөсү Лазар болуп саналат.

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 мисалы, колдонуучунун папкасында жайгашкан вася, түрү C: UsersvasyaWINDOWS. Жалпысынан алганда, баары жаман эмес: сиз өзүңүздүн администратор абийириңизди тазалоо үчүн жарлык файлына жана башкаларга кирүү укуктары менен ойной аласыз.

Source: www.habr.com

Комментарий кошуу