Problemet i virksomhedens karantæneperiode blev følgende: det er virkelig nødvendigt at minimere antallet af besøg på kontorer af specialister, der servicerer og rådgiver om applikationssoftware, og ærligt talt misbruger brugere ofte hjælpen fra specialister uden at ville dykke ned i selve problemet siger de "de kommer - de vil hjælpe - de vil gøre det, men jeg ryger/drikker kaffe osv." Telefonkonsultation, når du deler en server, er mere effektiv, hvis du ser fjernskærmen.
Efter "opfindelsen" af vores cykel dukkede fornuftige oplysninger op om emnet for artiklen:
Al information nedenfor er beregnet til dem, der tolererer unormale perversioner normalt for at opnå det ønskede resultat ved at opfinde unødvendige metoder.
For ikke at "trække katten i halen", vil jeg starte med den sidste: cyklen fungerer for den gennemsnitlige bruger, der bruger værktøjet
I. Konsol og skygge RDP.
Siden brug med administratorrettigheder for Server Manager-konsollen -> QuickSessionCollection -> ved at klikke på sessionen for brugeren af interesse, vælge Shadow fra kontekstmenuen for personale, der instruerer, hvordan softwaren skal bruges, er ikke en mulighed, blev en anden "træ" metode overvejet, nemlig:
1. Find ud af sessionens RDP-id:
query user | findstr Administrator
eller:
qwinsta | findstr Administrator
I øvrigt "| findstr Administrator"Det var kun praktisk, når man vidste præcis hvad Administrator du har brug for, eller brug kun den første del for at se alle, der er logget ind på serveren.
2. Opret forbindelse til denne session, forudsat at i domænet gruppepolitikker Indstillingen "Konfigurer fjernbetjeningsregler for brugersessioner af Remote Desktop Services" er valgt med mindst indstillingen "Overvåg session med brugertilladelse" valgt (
mstsc /shadow:127
Bemærk venligst, at listen kun vil indeholde brugerlogins.
Jeg gentager, at uden administratorrettigheder får du følgende:
Men til foreløbig fejlfinding af programmet, der vil blive diskuteret, brugte jeg en konto med administratorrettigheder.
II. Program
Så problemformuleringen: at skabe en simpel grafisk grænseflade for at forbinde til brugerens skyggesans med hans tilladelse, og sende en besked til brugeren. Det valgte programmeringsmiljø er Lazarus.
1. Vi får den fulde domæneliste over brugere "login" - "fulde navn" fra administratoren eller igen gennem konsollen:
wmic useraccount get Name,FullName
ingen forbyder selv dette:
wmic useraccount get Name,FullName > c:testusername.txt
Jeg vil med det samme sige, at det var Lazarus, der havde et problem med at behandle denne fil, da dens kodning som standard er UCS-2, så jeg måtte bare manuelt konvertere den til almindelig UTF-8. Der er mange faner i filstrukturen, eller rettere en masse mellemrum, som det blev besluttet at behandle programmatisk; før eller siden vil kodningsproblemet blive løst, og filen vil blive opdateret programmatisk.
Så ideen er at have en mappe tilgængelig for brugere af programmet, for eksempel c:test, hvori der vil være 2 filer: den første med login og fuldt navn, den anden med id_rdp og login for brugere. Dernæst behandler vi disse data så godt vi kan :).
I mellemtiden overfører vi dette (login og fuldt navn) indhold til et array for at associere med listen over sessioner:
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 undskylder for "massen af kode", de følgende punkter vil være mere kortfattede.
2. Ved at bruge samme metode fra forrige afsnit læser vi resultatet af at behandle listen til StringGrid-elementet, mens jeg vil give et "betydeligt" stykke kode:
2.1 Vi modtager den aktuelle liste over RDP-sessioner 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 Behandl filen (kun væsentlige kodelinjer er angivet):
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 selve forbindelsen ved at klikke på linjen med brugeren og dennes sessionsnummer:
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. Der er lavet et par dekorationer mere, såsom sortering ved at klikke på radioknappen og beskeder til brugeren eller alle brugere.
→ Fuld kildekode kan ses
III. Brug af AdminLink - hvad jeg så:
AdminLink genererer en genvej, der refererer til placeringen af hjælpeprogrammet admilaunch.exe, og en personlig kopi af startværktøjet AdmiRun.Exe som f.eks. ligger i brugerens mappe Vasya, type C:UsersvasyaWINDOWS. Generelt er ikke alt så slemt: du kan lege med adgangsrettigheder til genvejsfilen og andre for at rense din egen administrators samvittighed.
Kilde: www.habr.com