A probléma a vállalat karanténidejében a következő lett: valóban minimalizálni kell a szakemberek irodai látogatásainak számát, akik az alkalmazás szoftverrel kapcsolatban nyújtanak támogatást és tanácsot, és őszintén szólva, a felhasználók gyakran visszaélnek a szakemberek segítségével, anélkül, hogy valóban mélyebben megértenék a problémát, azzal, hogy "jönnek — segítenek — megcsinálják, amíg én egy kicsit pihenek/kávézom stb.". A telefonos konzultáció a szerver távoli képernyőjének megosztása mellett hatékonyabb.

Miután a "biciklink" kitalálásra került, újabb érdemi információ bukkant fel a cikk témájáról: vagy vagy . Mindegyikük konzol használatát feltételezi, akár egyszerű párbeszédes elemekkel is.
Az alábbi információ mindenki számára készült, aki normálisan bírja a nem normális túlkapásokat a kívánt eredmény elérése érdekében, felesleges megoldások kitalálásával.
A "macska húzogatása" elkerülése érdekében az utolsóval kezdem: a bicikli egy átlagos felhasználónál az , amiért a szerzőjének köszönet jár.
I. Konzol és shadow RDP.
Mivel a Server Manager konzol adminisztrátori jogokkal való használata -> QuickSessionCollection -> az érdeklődő felhasználó munkamenetének kiválasztásával a jobb klikk menüben a Shadow (Árnyékkép) lehetőség választásával a szoftverrel kapcsolatos munkát instruáló személyzet számára , — nem volt opció, ezért egy másik "fapados" módszer került előtérbe, mégpedig:1. Megtudjuk az RDP munkamenet id-jét:
query user | findstr Administrator
qwinsta | findstr Administratorvagy:
" | findstr Administrator" csak akkor volt hasznos, ha tudtad, hogy pontosanmire van szükséged, vagy a teljes népszerűsítést használd, hogy lásd az összes bejelentkezett felhasználót a szerveren. Administrator 2. Csatlakozunk ehhez a munkamenethez, feltéve, hogy a domainekben
![]()
csoportházirendekben a "Távoli irányítási szabályok a távoli asztali szolgáltatások felhasználói munkameneteihez" paraméter legalább "A felhasználó engedélyével naplózzák a munkamenetet" opcióra van állítva ( mstsc /shadow:127):
Kérem, vegye figyelembe, hogy a listában csak a felhasználói bejelentkezések jelennek meg.Ismétlem, hogy adminisztrátori jogok nélkül a következőket fogja kapni:
De a következő program előzetes hibakereséséhez, amelyről szó lesz, adminisztrátori jogokkal rendelkező fiókot használtam.

Но для предварительной отладки программы, о которой пойдет речь, я использовал учетку с правами администратора.
II. Program
Tehát a feladat a következő: egy egyszerű grafikus felület létrehozása a felhasználó árnyékérzékelőjéhez való csatlakozáshoz, a felhasználó engedélyével, és üzenet küldése a felhasználónak. A programozási környezet Lazarus lett kiválasztva.
1. A felhasználók teljes domainlistájának megszerzése "bejelentkezés" — "teljes név" az adminisztrátortól, vagy ismét a konzolon keresztül:
wmic useraccount get Name,FullName Senki nem tilthatja meg ezt így:
wmic useraccount get Name,FullName > c:testusername.txtElmondom, hogy a Lazarus-nak problémája volt a fájl kezelésével, mivel alapértelmezett kódolása UCS-2, ezért egyszerűen manuálisan kellett átkonvertálni normál UTF-8-ra. A fájl struktúrájában sok tabulátor van, pontosabban sok szóköz, amit programozott módon kellett feldolgozni, korán vagy későn a karakterkódolás problémája megoldódik, és a fájl programozottan frissülni fog.
Tehát a tervek szerint lesz egy mappa, amely elérhető a program felhasználói számára, például c:test, amelyben 2 fájl lesz: az első a bejelentkezéssel és a teljes névvel, a második az id_rdp-vel és a felhasználók bejelentkezésével. Ezeket az adatokat aztán feldolgozzuk, ahogy tudjuk:).
Addig is, hogy társítsuk a munkamenetek listájával, átkonvertáljuk ezt (bejelentkezés és teljes név) egy tömbbe:
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('Fájl feldolgozási hiba. Részletek: '+E.Message);
end;end;Elnézést kérek a "sok kódért", a következő pontok rövidebbek lesznek.
2. Hasonlóan az előző pontban leírt módszerhez, olvassuk be a lista feldolgozásának eredményét a StringGrid elembe, ezért bemutatok egy "jelentős" kód részletet:
2.1. Beszerezzük az aktuális RDP munkamenetek listáját egy fájlba:
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árhatunk hosszabb ideig is, amíg a fájl elkészül az olvasáshoz2.2. Feldolgozzuk a fájlt (csak a jelentős kódrészletek vannak megadva):
StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; \/\/ciklusban betesszük a StringGrid1-be
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); \/\/eltávolítjuk a szóközöket a belépési névből
if (SearchArr(login1)>=0) then \/\/keresünk az p1-es tömbben, és beírjuk az adatbázisba a nevet
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; \/\/ vagy beírunk egy pluszjelet:)
.... \/\/ a felhasználó választása szerint rendezünk és formázunk az adatok alapján
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2); 3. Közvetlenül a csatlakozás, amikor a felhasználó és az ő munkamenetének számát tartalmazó sorra kattintunk:
id:=(StringGrid1.Row);\/\/ megtudjuk a sor számát IntToStr(StringGrid1.Row)
ids:=StringGrid1.Cells[2,id]; \/\/megszerezzük az RDP azonosítót
cmdline:='\/c mstsc \/shadow:'+ ids; \/\/és csatlakozunk....
if (b_rdp.Checked=True) then if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then; 4. Készült még néhány díszítés, mint például rendezés kattintásra a radiobutton-re, és üzenetek a felhasználónak, vagy minden felhasználónak.

→ A teljes forrást kódot lehet megtekinteni
III. Az AdminLink alkalmazása — amit láttam:
Az AdminLink valóban létrehoz egy parancsikont, amely hivatkozik az eszköz elérési útjára admilaunch.exe, és a program elindításának saját másolatára AdmiRun.Exe ami a felhasználó mappájában található, például vasya, hasonlóan C:UsersvasyaWINDOWS. Összességében nem olyan rossz: a fájl parancsikonra vonatkozó jogosultságokkal és egyebekkel játszadozva, tisztábbá tehetjük a saját adminisztrátori lelkiismeretünket.
Forrás: habr.com
