Problemet under karanteneperioden til bedriften ble følgende: det er virkelig nødvendig å minimere antall besøk til kontorer av spesialister som betjener og rådgiver om applikasjonsprogramvare, og ærlig talt, brukere ofte misbruker hjelpen fra spesialister uten å ønske å fordype seg i selve problemet sier de "de vil komme - de vil hjelpe - de vil gjøre det, men jeg skal røyke/drikke kaffe osv." Telefonkonsultasjon når du deler en server er mer effektivt hvis du ser på den eksterne skjermen.
Etter "oppfinnelsen" av sykkelen vår dukket det opp fornuftig informasjon om emnet for artikkelen:
All informasjon nedenfor er beregnet på de som tolererer unormale perversjoner normalt for å oppnå ønsket resultat ved å finne opp unødvendige metoder.
For ikke å "dra katten i halen", begynner jeg med den siste: sykkelen fungerer for den gjennomsnittlige brukeren som bruker verktøyet
I. Konsoll og skygge RDP.
Siden bruk med administratorrettigheter for Server Manager-konsollen -> QuickSessionCollection -> ved å klikke på økten til brukeren av interesse, velge Shadow fra kontekstmenyen for personell som instruerer hvordan programvaren skal brukes, ikke er et alternativ, ble en annen "tre" metode vurdert, nemlig:
1. Finn ut RDP-ID-en for økten:
query user | findstr Administrator
eller:
qwinsta | findstr Administrator
Dessuten "| findstr Administrator"Det var bare praktisk når du visste nøyaktig hva administrator du trenger, eller bruk kun den første delen for å se alle som er logget på serveren.
2. Koble til denne økten, forutsatt at i domenet gruppepolicyer Alternativet "Sett opp fjernkontrollregler for brukersesjoner for Remote Desktop Services" er valgt med minst alternativet "Overvåk økt med brukertillatelse" valgt (
mstsc /shadow:127
Vær oppmerksom på at listen kun vil inneholde brukerpålogginger.
Jeg gjentar at uten administratorrettigheter vil du få følgende:
Men for foreløpig feilsøking av programmet som vil bli diskutert, brukte jeg en konto med administratorrettigheter.
II. Program
Så problemformuleringen: å lage et enkelt grafisk grensesnitt for å koble til brukerens skyggesans med hans tillatelse, og sende en melding til brukeren. Programmeringsmiljøet som er valgt er Lazarus.
1. Vi får den fullstendige domenelisten over brukere "pålogging" - "fullt navn" fra administratoren, eller igjen gjennom konsollen:
wmic useraccount get Name,FullName
ingen forbyr selv dette:
wmic useraccount get Name,FullName > c:testusername.txt
Jeg vil si med en gang at det var Lazarus som hadde et problem med å behandle denne filen, siden kodingen som standard er UCS-2, så jeg måtte bare manuelt konvertere den til vanlig UTF-8. Det er mange faner i filstrukturen, eller rettere sagt mange mellomrom, som det ble besluttet å behandle programmatisk; før eller siden vil kodingsproblemet bli løst, og filen vil bli oppdatert programmatisk.
Så, ideen er å ha en mappe tilgjengelig for brukere av programmet, for eksempel c:test, der det vil være 2 filer: den første med pålogging og fullt navn, den andre med id_rdp og pålogging av brukere. Deretter behandler vi disse dataene så godt vi kan :).
I mellomtiden, for å knytte til listen over økter, overfører vi dette (pålogging og fullt navn) innhold til en matrise:
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;
Jeg beklager "massen med kode", de følgende punktene vil være mer konsise.
2. Ved å bruke samme metode fra forrige avsnitt, leser vi resultatet av å behandle listen til StringGrid-elementet, mens jeg vil gi en "betydelig" kodebit:
2.1 Vi mottar gjeldende liste over RDP-økter i en fil:
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 Behandle filen (kun signifikante kodelinjer er angitt):
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. Direkte tilkobling ved å klikke på linjen med brukeren og hans øktnummer:
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. Det er laget et par dekorasjoner til, som sortering ved å klikke på radioknappen, og meldinger til brukeren eller alle brukere.
→ Full kildekode kan sees
III. Bruke AdminLink - det jeg så:
AdminLink genererer en snarvei som refererer til plasseringen av verktøyet admilaunch.exe, og en personlig kopi av lanseringsverktøyet AdmiRun.Exe som ligger i brukerens mappe, for eksempel Vasja, type C:UsersvasyaWINDOWS. Generelt er ikke alt så ille: du kan leke med tilgangsrettigheter til snarveifilen og andre for å tømme din egen administratorsamvittighet.
Kilde: www.habr.com