Problém během karantény v práci společnosti byl následující: skutečně je potřeba minimalizovat počet návštěv kanceláří specialisty, kteří se zabývají aplikovaným softwarem, a abych byl upřímný, uživatelé často zneužívají pomoc specialistů, aniž by se chtěli ponořit do samotné problematiky, říkají: „přijdou — pomohou — udělají, já si mezitím vyjdu na cigaretu nebo si dám kávu atd.“ Telefonní konzultace při společném přístupu k serveru jsou efektivnější, pokud se díváte na vzdálenou obrazovku.

Ihned po „vynalezení“ našeho kola jsme obdrželi použitelné informace na téma článku: nebo nebo . Všechny tyto možnosti předpokládají použití konzole, dokonce i s prvky jednoduchého dialogu.
Všechny informace uvedené níže jsou určeny pro ty, kteří normálně snášejí nenormální úchylky pro dosažení požadovaného výsledku, vynalézají zbytečné metody.
Abych „nedržel kočku za ocas“, začnu tím nejposlednějším: kolo funguje u běžného uživatele za pomoci utilitky , za což autorovi patří dík.
I. Konzole a shadow RDP.
Jelikož použití s administrátorskými právy konzole Server Manager -> QuickSessionCollection -> kliknutím na relaci zajímavého uživatele a výběrem ve kontextovém menu Shadow (Stínová kopie) pro personál, školící, jak pracovat se softwarem, — není variantou, byl zvážen jiný „dřevěný“ způsob, a to:
1. Zjistíme RDP ID relace:
query user | findstr Administratornebo:
qwinsta | findstr Administrator Přitom "| findstr Administrator" bylo pohodlné pouze tehdy, když víte, že konkrétně Administrator je to, co potřebujete, jinak použijte pouze první část pro zobrazení všech přihlášených na serveru.
![]()
2. Připojíme se k této relaci, pokud v doménových skupinových politikách je parametr „Nastavuje pravidla pro vzdálené ovládání pro uživatelské relace služeb vzdálených pracovních stanic“ nastaven alespoň na „Pozorování relace se souhlasem uživatele“ ():
mstsc /shadow:127Všimněte si, že v seznamu budou pouze přihlášení uživatelé.
Opakuji, že bez administrátorských práv obdržíte následující:

Ale pro předběžné ladění programu, o kterém bude řeč, jsem použil účet s administrátorskými právy.
II. Program
Takže zadání je: vytvoření jednoduchého grafického rozhraní pro připojení k skrytému smyslu uživatele s jeho souhlasem a odeslání zprávy uživateli. Programovací prostředí bylo zvoleno Lazarus.
1. Získáme kompletní seznam doménových uživatelů „přihlašovací jméno“ — „celé jméno“ od administrátora, nebo opět přes konzolu:
wmic useraccount get Name,FullName nikdo to neomezuje ani takto:
wmic useraccount get Name,FullName > c:testusername.txtIhned řeknu, že právě u Lazarus byl problém s zpracováním tohoto souboru, protože jeho kódování je ve výchozím nastavení UCS-2, takže jsem ho musel ručně převést na běžný UTF-8. Ve struktuře souboru je mnoho tabulátorů, lépe řečeno množství mezer, které bylo rozhodnuto programově zpracovat, dříve nebo později bude úloha s kódováním vyřešena a soubor bude programově aktualizován.
Takže, v myšlence bude složka dostupná pro uživatele programu, například c:test, ve které budou 2 soubory: první s loginem a celým jménem, druhý s id_rdp a přihlašovacími jmény uživatelů. Dále tyto údaje zpracováváme, jak umíme:).
A zatím pro asociaci se seznamem relací přesouváme toto (login a celé jméno) obsah do pole:
procedure Tf_rdp.UserF2Array;
var
F:TextFile; i:integer; f1, line1:String; fL: TStringList;
begin //f_d globální cesta k umístění souborů
f1:=f_d+'user_name.txt'; //úkol přečíst obsah souboru do pole
fL := TStringList.Create; // řetězec podrobíme metamorfózám s oddělovači
fL.Delimiter := '|'; fL.StrictDelimiter := True;
AssignFile(F,f1);
try // Otevřít soubor pro čtení
reset(F); ReadLn(F,line1);
i:=0;
while not eof(F) do // Čteme řádky, dokud nedojdeme na konec souboru
begin
ReadLn(F,line1);
line1:= StringReplace(line1, ' ', '|',[]); //nahrazujeme první s dvojitými mezerami oddělovačem |
// odstraníme všechny dvojité mezery
while pos(' ',line1)>0 do line1:= StringReplace(line1, ' ', ' ', [rfReplaceAll]);
begin
if (pos('|',line1)>0) then
begin // pokud oddělovač existuje, vložte ho do pole
fL.DelimitedText :=line1; // rozdělujeme na sloupce
if (fL[0]'') then // pokud účet má jméno
begin // vložte ho do pole
inc(i); // zbavujeme se možných osamělých mezer v přihlašovacím jménu
fam[0,i]:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]);
fam[1,i]:=fL[0];
end;end;end;end; // Hotovo. Zavřete soubor.
CloseFile(F);
Fl.Free;
except
on E: EInOutError do ShowMessage('Chyba zpracování souboru. Podrobnosti: '+E.Message);
end;end;Omlouvám se za "mnoho kódu", následující body budou výstižnější.
2. Stejně jako metodou z předchozího bodu načteme výsledek zpracování seznamu do prvku StringGrid, přičemž uvedu „významný“ kus kódu:
2.1 Získáme aktuální seznam RDP relací do souboru:
f1:=f_d+'user.txt';
cmdline:='\/c query user >'+ f1;
if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1)=0 then;
Sleep(500); \/\/ můžeme počkat déle, než se soubor pro čtení vytvoří2.2 Zpracováváme soubor (uvedeny jen významné řádky kódu):
StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; \/\/ vkládáme do StringGrid1 v cyklu
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); \/\/ odstraníme mezery z loginu
if (SearchArr(login1)>=0) then \/\/ hledáme v poli z p1. login a zapisujeme do tabulky FIO
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; \/\/ nebo zapíšeme plusíka:)
.... \/\/ podle volby uživatele třídíme a formátujeme dle údajů
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2); 3. Přímo samotné připojení při kliknutí na řádek s uživatelským jménem a číslem jeho relace:
id:=(StringGrid1.Row);\/\/ zjistit číslo řádku IntToStr(StringGrid1.Row)
ids:=StringGrid1.Cells[2,id]; \/\/ získáme identifikátor rdp
cmdline:='\/c mstsc \/shadow:'+ ids; \/\/ a připojíme se....
if (b_rdp.Checked=True) then if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then; 4. Bylo uděláno ještě pár vylepšení, jako je třídění po kliknutí na radiobutton, a zprávy pro uživatele, nebo všechny uživatele.

→ Úplný zdrojový kód lze vidět
III. Použití AdminLink — co jsem viděl:
AdminLink skutečně generuje zástupce, který odkazuje na umístění utility admilaunch.exe, a osobní kopii utility spouštění AdmiRun.Exe která se nachází ve složce uživatele, například vasya, ve stylu C:UsersvasyaWINDOWS. Celkově to není tak špatné: s právy přístupu k souboru zástupce a dalšími, lze si pohrát pro vyčištění vlastní administrativní svědomí.
Zdroj: habr.com
