Праблема ў перыяд каранціннай працы прадпрыемства стала наступнай: сапраўды трэба мінімізаваць колькасць наведванняў кабінетаў спецыялістамі, якія абслугоўваюць і кансультуюць па прыкладным ПЗ, ды і сказаць шчыра, карыстальнікі часцяком злоўжываюць дапамогай спецыялістаў не жадаючы ўнікаць у само пытанне, маўляў «прыйдуць - дапамогуць - зробяць, а я пакуль пакуру/пап'ю каву і да т.п.». Кансультацыя па тэлефоне пры сумесным доступе да сервера больш эфектыўна, калі праглядаць выдалены экран.
Ужо пасля «вынаходства» нашага ровара падвярнулася разумная інфармацыя на тэму артыкула:
Уся выкладзеная ніжэй інфармацыя прызначана для тых, хто нармальна пераносіць ненармальныя скрыўленні для атрымання патрэбнага выніку, вынаходзячы непатрэбныя спосабы.
Каб "не цягнуць ката за хвост", пачну з апошняга: ровар працуе ў звычайнага карыстальніка з дапамогай утыліты
I. Кансоль і shadow RDP.
Так як выкарыстанне з адмінскімі правамі кансолі Server Manager -> QuickSessionCollection -> пстрыкнуўшы па сесіі які цікавіць карыстача, абраўшы ў кантэкстным меню Shadow (Ценевая копія) для персанала, які інструктуе па працы з ПЗ, - не варыянт, быў разгледжаны іншы «драўляны» спосаб, а менавіта:
1. Даведаемся RDP id сесіі:
query user | findstr Administrator
ці:
qwinsta | findstr Administrator
Прычым "| findstr Administratorбыло зручна толькі калі ты ведаеш, што менавіта адміністратар табе патрэбен, або выкарыстоўваць толькі першую частку для бачання ўсіх залагініліся на серверы.
2. Падключаемся да гэтай сесіі, пры ўмове што ў даменных групавых палітыках параметр «Усталёўвае правілы выдаленага кіравання для карыстацкіх сеансаў службаў выдаленых працоўных сталоў» абраны параметр як мінімум «Назіранне за сеансам з дазволу карыстальніка» (
mstsc /shadow:127
Прашу звярнуць увагу, што ў спісе будуць толькі лагіны карыстальнікаў.
Паўтаруся, што без адмінскіх правоў вы атрымаеце наступнае:
Але для папярэдняй адладкі праграмы, аб якой пайдзе прамову, я выкарыстаў улік з правамі адміністратара.
II. Праграма
Такім чынам пастаноўка задачы: стварэнне няма каго простага графічнага інтэрфейсу для падлучэння да ценявага сэнсу карыстача з яго дазволу, адпраўка паведамлення карыстачу. Асяроддзе праграмавання абрана Lazarus.
1. Атрымліваем поўны даменны спіс карыстальнікаў «лагін» — «поўнае імя» ў адміна, альбо зноў-такі праз кансоль:
wmic useraccount get Name,FullName
ніхто не забараняе нават так:
wmic useraccount get Name,FullName > c:testusername.txt
Скажу адразу, што менавіта ў Lazarus аказалася праблема з апрацоўкай гэтага файла, бо па змаўчанні яго кадоўка UCS-2, таму прыйшлося проста пераўтварыць уручную ў звычайны UTF-8. У структуры файла шмат табуляцый, дакладней мноства прабелаў, якія было вырашана ўсё ж праграмна апрацаваць, рана ці позна задача з кадоўкай будзе вырашана, і файл будзе праграмна абнаўляцца.
Такім чынам, у задумцы тэчка, даступная для карыстачоў праграмы, напрыклад c:test, у якой будзе 2 файла: першы з login і fullname, другі з id_rdp і login карыстачоў. Далей гэтыя дадзеныя апрацоўваем як можам:).
А пакуль для асацыявання са спісам сесій пераносім гэта (login і fullname) змесціва ў масіў:
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. Зроблена яшчэ пару упрыгожвальніцтваў тыпу сартавання па зграі на radiobutton, і паведамленні карыстачу, альбо ўсім карыстачам.
→ Поўны зыходны код можна ўбачыць
III. Ужыванне AdminLink - што я ўбачыў:
AdminLink сапраўды генеруе ярлык, у якім спасылаецца на размяшчэнне ўтыліты admilaunch.exe, і асабістай копіяй утыліты запуску AdmiRun.Exe якая знаходзіцца ў тэчцы карыстальніка, напрыклад vasya, па тыпу C:UsersvasyaWINDOWS. Увогуле, не ўсё так дрэнна: з правамі доступу да файла цэтліка і іншымі, для ачышчэння ўласнага адмінскага сумлення, можна пагуляцца.
Крыніца: habr.com