Karantini tööperioodi probleem osutus järgmiseks: tõepoolest tuleb vähendada spetsialistide kabineti külastuste arvu, kes tegelevad rakendustarkvara teenindamise ja nõustamisega, ja ausalt öeldes, kasutajad kuritarvitavad sageli spetsialistide abi, soovimata end küsimusse süveneda, nagu "tulevad - aitavad - teevad, ja mina vahepeal suitsetan/joon kohvi jne." Telefonikonsultatsioon koos serveri kaugjuurdepääsuga on tõhusam, kui jagada kaugekraani.

Pärast meie ratta "leiutamist" tuli kokku mõistlik teave artikli teema kohta: või või . Kõik need tähendavad konsooli kasutamist, isegi lihtsate dialoogielementidega.
Käesolev teave on mõeldud neile, kes normaalselt taluvad ebamugavaid aberratsioone vajaliku tulemuse saavutamiseks, leiutades tarbetuid viise.
Et "kassi sabast kinni ei tõmmata", alustan viimastest: ratas töötab tavakasutajale utiliidi abil , mille autori eest, aitäh.
I. Konnsool ja shadow RDP.
Kuna Server Manageri konsooli kasutamine administraatori õigustega -> QuickSessionCollection -> klõpsates huvipakkuval sessioonil, valides kontekstimenüüst Shadow (Varjatud koopia) töötamiseks nõustajatele, - ei olnud variant, kaaluti teist "puupüsti" meetodit, nimelt:
1. Saame RDP sessiooni id:
query user | findstr Administratorvõi:
qwinsta | findstr Administrator Mille puhul "| findstr Administrator" oli mugav ainult siis, kui tead, et just Administrator seda sul vaja on, või kasutada lihtsalt esimest osa, et näha kõiki serverisse sisse loginud kasutajaid.
![]()
2. Ühendume selle sessiooniga, tingimusel et domeeni gruppide poliitikates parameeter "Keenud reeglid kaugjuhtimiseks kaugseansside jaoks" on valitud vähemalt "Kasutaja heakskiidul seansi jälgimine" ():
mstsc /shadow:127Palun märkige, et loendis on ainult kasutajate logiinid.
Kordan, et administreerimise õigusteta saad järgmise:

Aga programmi esialgseks silumiseks, millest jutt tuleb, kasutasin administraatori õigustega kontot.
II. Programm
Nii et ülesanne: luua lihtne graafiline liides kasutaja varjatud sensori ühendamiseks tema nõusolekul ning saata kasutajale sõnum. Programmeerimiskeskkond valiti Lazarus.
1. Saame administraatorilt või uuesti konsoolist täieliku domeeninime nimekirja kasutajatest «logi sisse» — «täisnimi»:
wmic useraccount get Name,FullName Keegi ei keela ka nii:
wmic useraccount get Name,FullName > c:testusername.txtTulen kohe välja, et just Lazarusega tekkis probleeme selle faili töötlemisel, kuna selle kodeering on vaikimisi UCS-2, seega tuli see lihtsalt käsitsi tavaliseks UTF-8-ks ümber konverteerida. Faili struktuuris on palju tabulatsiooni, või pigem palju tühikuid, mida otsustasime siiski programmeerimisel töödelda, varem või hiljem lahendame kodeeringu probleemi ja fail uuendatakse automaatselt.
Oletame, et kaust, mis on programa kasutajatele ligipääsetav, näiteks c:test, sisaldab kahte faili: esimene logini ja täisnimega, teine id_rdp ja kasutajate logidega. Edasi töötleme andmeid nii nagu oskame:).
Ja seni, et seostada see seanssiloendiga, teisendame selle (logi sisse ja täisnimi) sisu massiivi:
procedure Tf_rdp.UserF2Array;
var
F:TextFile; i:integer; f1, line1:String; fL: TStringList;
begin
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, ' ', '|',[]);
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('Faili töötlemise viga. Üksikasjad: '+E.Message);
end;end;Palun vabandust „palju kode”, järgmised punktid on lühemad.
2. Samuti loeme eelnevas punktis kirjeldatud meetodi kaudu tulemuse loendi töötlemisest elemendisse StringGrid, tuues näitena "olulise" koodi osa:
2.1 Saame kehtiva RDP sessioonide loendi faili:
f1:=f_d+'user.txt';
cmdline:='\/c query user >'+ f1;
if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1)=0 then;
Sleep(500); \/\/ võib kauem oodata, kuni fail loetakse2.2 Töötleme faili (ainult olulised koodiread on toodud):
StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; \/\/ lisame tsüklis StringGrid1
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); \/\/ eemaldame loginnast tühikud
if (SearchArr(login1)>=0) then \/\/ otsime p1-st logind ja kirjutame tabelisse nime
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; \/\/ või kirjutame plussiku:)
.... \/\/ sõltuvalt kasutaja valikust sorteerime ja vormindame andmete järgi
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2); 3. Ühenduse loomine kliendiga, kui klõpsate kasutaja ja tema seansi numbri real:
id:=(StringGrid1.Row);\/\/ saame rea numbri IntToStr(StringGrid1.Row)
ids:=StringGrid1.Cells[2,id]; \/\/ saame rdp identifikaatori
cmdline:='\/c mstsc \/shadow:'+ ids; \/\/ ja ühendame....
if (b_rdp.Checked=True) then if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then; 4. Lisatud on veel paar esteetilist funktsiooni, nagu sorteering klikkimisega radiobuttoni peal, ja sõnum kasutajale või kõigile kasutajatele.

→ Täielikku algkoodi saab näha
III. AdminLinki rakendamine — mida ma nägin:
AdminLink tõepoolest genereerib otsetee, mis viitab utiliidi asukohale admilaunch.exe, ja isiklik koopia utiliidist AdmiRun.Exe mis asub kasutaja kaustas, näiteks vasya, sarnaselt C:UsersvasyaWINDOWS. Ühesõnaga, kõik pole nii halb: faili otsetee ja teiste õiguste osas, et puhastada enda adminnide südametunnistust, saab mängida.
Allikas: habr.com
