Problém počas obdobia karantény pre podniky bol nasledujúci: skutočne je potrebné minimalizovať počet návštev kancelárií odborníkmi, ktorí sa zaoberajú a poskytujú poradenstvo ohľadom aplikačného softvéru, a povedzme otvorene, používatelia často zneužívajú pomoc odborníkov, nechcúc sa zaoberať samotnou otázkou, akoby povedali: "prídu — pomôžu — urobia, a ja zatiaľ pôjdem fajčiť/piť kávu a podobne." Konzultácia telefonicky pri spoločnom prístupe k serveru je efektívnejšia, ak sa prezerá vzdialená obrazovka.

Už po "vynájdení" nášho bicykla sa našli zmysluplné informácie k téme článku: alebo alebo . Všetky z nich predpokladajú použitie konzoly, aj s prvkami jednoduchého dialógu.
Všetky nižšie uvedené informácie sú určené pre tých, ktorí normálne znášajú nenormálne úchylky na dosiahnutie požadovaného výsledku, vymýšľajúc zbytočné spôsoby.
Aby som "neťahal mačku za chvost", začnem od konca: bicykel funguje u bežného používateľa s pomocou utilitky , za čo autorovi ďakujem.
I. Konzola a shadow RDP.
Keďže používanie s adminskými právami konzoly Server Manager -> QuickSessionCollection -> kliknutím na reláciu zaujímavého používateľa, výberom v kontextovej ponuke Shadow (Tienená kópia) pre personál, ktorý školí o práci s ПО, — nie je variant, bol zvažovaný iný "drevený" spôsob, a to:
1. Zistíme RDP id relácie:
query user | findstr Administratoralebo:
qwinsta | findstr Administrator Prípadne "| findstr Administrator" bolo užitočné len keď viete, že presne Administrator je to, čo potrebujete, alebo použiť len prvú časť na prezeranie všetkých používateľov prihlásených na server.
![]()
2. Pripojíme sa k tejto relácii, pokiaľ sú v doménových skupinových politikách parametre "Špecifikuje pravidlá vzdialeného ovládania pre používateľské relácie služieb vzdialených pracovných stolov" zvolené aspoň ako "Sledovanie relácie so súhlasom používateľa" ():
mstsc /shadow:127Upozorňujem, že v zozname budú iba prihlasovacie údaje používateľov.
Opakujem, že bez adminských práv dostanete nasledujúce:

Ale na predbežné ladenie programu, o ktorom sa bude hovoriť, som použil účet s administrátorskými právami.
II. Program
Takže úloha je stanovená: vytvorenie jednoduchého grafického rozhrania pre pripojenie k „tieňovému“ senzoru používateľa s jeho súhlasom a odoslanie správy používateľovi. Programovacie prostredie bolo zvolené Lazarus.
1. Získavame úplný zoznam používateľov „login“ – „celé meno“ od administrátora, alebo opäť cez konzolu:
wmic useraccount get Name,FullName nikto to ani nezakazuje:
wmic useraccount get Name,FullName > c:testusername.txtPoviem rovno, že práve v Lazaruse bola problémy s spracovaním tohto súboru, pretože jeho predvolená kódovanie je UCS-2, takže som ho musel jednoducho rukami previesť na bežný UTF-8. V štruktúre súboru je veľa tabulátorov, presnejšie množstvo medzier, ktoré sme sa rozhodli nakoniec spracovať programovo, skôr či neskôr sa táto úloha s kódovaním vyrieši a súbor sa bude aktualizovať programovo.
Takže, plán je, že priečinok, ktorý bude dostupný pre používateľov programu, napríklad c:test, bude obsahovať 2 súbory: prvý s login a fullname, druhý s id_rdp a login používateľov. Následne tieto údaje spracujeme, ako môžeme:).
A zatiaľ na asociáciu so zoznamom relácií prenášame toto (login a fullname) obsah do poľa:
procedure Tf_rdp.UserF2Array;
var
F:TextFile; i:integer; f1, line1:String; fL: TStringList;
begin //f_d globálna cesta k umiestneniu súborov
f1:=f_d+'user_name.txt'; //úloha načítať do poľa obsah súboru
fL := TStringList.Create; // riadok podrobíme metamorfózam s oddeľovačmi
fL.Delimiter := '|'; fL.StrictDelimiter := True;
AssignFile(F,f1);
try // Otvoriť súbor na čítanie
reset(F); ReadLn(F,line1);
i:=0;
while not eof(F) do // Čítame riadky, kým sa súbor nevyčerpá
begin
ReadLn(F,line1);
line1:= StringReplace(line1, ' ', '|',[]); //nahradíme prvé 2 medzery oddeľovačom |
// odstránime všetky dvojité medzery
while pos(' ',line1)>0 do line1:= StringReplace(line1, ' ', ' ', [rfReplaceAll]);
begin
if (pos('|',line1)>0) then
begin //ak oddeľovač existuje, uložme ho do poľa
fL.DelimitedText :=line1; // rozdelíme na stĺpce
if (fL[0] '') then //ak účet má meno
begin //vložíme ho do poľa
inc(i); // zbavíme sa možných osamelých medzier v logine
fam[0,i]:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]);
fam[1,i]:=fL[0];
end;end;end;end; // Hotovo. Zatvárame súbor.
CloseFile(F);
Fl.Free;
except
on E: EInOutError do ShowMessage('Chyba spracovania súboru. Podrobnosti: '+E.Message);
end;end;Ospravedlňujem sa za „veľa kódu“, ďalšie body budú stručnejšie.
2. Rovnako metódou z predchádzajúceho bodu prečítame výsledok spracovania zoznamu do prvku StringGrid, pričom uvádzam "významný" úryvok kódu:
2.1 Získame aktuálny zoznam RDP relácií do súboru:
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čkať aj dlhšie, kým sa súbor vytvorí na čítanie2.2 Spracovávame súbor (uvádzam len významné riadky kódu):
StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; \/\/ v cykle pridávame do StringGrid1
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); \/\/ odstraňujeme z loginu medzery
if (SearchArr(login1)>=0) then \/\/ hľadáme v poli z p1. login a zapisujeme do tabuľky FIO
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; \/\/ alebo zapisujeme plusík:)
.... \/\/ v závislosti od voľby používateľa triedime a formátujeme podľa údajov
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2); 3. Priamo pripojenie po kliknutí na riadok s používateľom a číslom jeho relácie:
id:=(StringGrid1.Row);\/\/ zistíme číslo riadku IntToStr(StringGrid1.Row)
ids:=StringGrid1.Cells[2,id]; \/\/ získame identifikátor rdp
cmdline:='\/c mstsc \/shadow:'+ ids; \/\/ a pripojíme sa....
if (b_rdp.Checked=True) then if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then; 4. Urobilo sa ešte pár vylepšení typu triedenia po kliknutí na radiobutton a správa používateľom, alebo všetkým používateľom.

→ Úplný zdrojový kód si môžete pozrieť
III. Použitie AdminLink — čo som videl:
AdminLink skutočne generuje skratku, ktorá odkazuje na umiestnenie utilitky admilaunch.exe, a osobnú kópiu utilitky na spustenie AdmiRun.Exe ktorá sa nachádza v priečinku používateľa, napríklad vasya, typu C:UsersvasyaWINDOWS. Všeobecne, nie je to také zlé: s právami prístupu k súboru skratky a inými, pre vyčistenie vlastného administrátorského svedomia, sa dá pohrať.
Zdroj: habr.com
