Utilitas humanae umbrae nexum non administratorem RDP user sessiones in WinServer 2012R2

Quaestio in periodo incepti quarentenam haec facta est: revera necesse est numerum visitationum officiorum minuere a peritis operandi et consulendi in programmate applicationis, et libere loquendo, utentes saepe abutuntur ope specialium sine defectu in eam intromittere. rem ipsam, inquiunt, "venturi sunt - aderunt - facient, sed fumum/potabo capulus, etc." Telephonium consultatio cum servo communicans efficacior est si remotum velum inspicias.

Utilitas humanae umbrae nexum non administratorem RDP user sessiones in WinServer 2012R2

Post "inventionem" nostrae birotae, sanae informationes in argumento articuli versae sunt: RDS Shadow - umbra nexum ad RDP user sessiones in Fenestra Servo MMXII R2012 aut Unprivileged user umbra modus per fenestras servo aut Delegatus procuratio RDP sessionum. Earum omnes solacii usum, etiam simplicis dialogi elementa, implicant.

Omnes informationes infra destinatur illis qui alius tolerat perversiones Northmanni ad obtinendum optatum exitum inveniendi methodos necessarias.
Ut felem cauda non trahere, incipiam ab ultima: cursoriam operatur in usuario mediocris utilitatis. AdmiLinkpro quo egit auctor.

I. Consola et umbra RDP.

Quia usus est administrator iura ministri Procurator console -> QuickSessionCollection -> strepitando in sessione usurarii utentis, eligens umbram ex menu contextu contextus ad personas instruentes quomodo utendi softwarenon bene, alia methodus lignea considerabatur, nempe;

1. Find sicco RDP id sessionis;

query user | findstr Administrator

aut:

qwinsta | findstr Administrator 

Sed et "| findstr administrator"Tantum commodum erat cum scires quid exacte" Administrator opus est, vel prima tantum parte utere ut omnes initium in servo viderent.

Utilitas humanae umbrae nexum non administratorem RDP user sessiones in WinServer 2012R2

2. Coniungere huic sessioni, dummodo in dominico coetus consilia "Sessiones remotae Desktop Services" "sessionibus usorum remotis imperiis constitue" optio eligetur cum saltem "sessionis monitoris cum permissione usoris" optio electa (magis):

mstsc /shadow:127

Quaeso nota quod indicem solum logins usorum continent.

Dico sine iure admin sequentia habebis:

Utilitas humanae umbrae nexum non administratorem RDP user sessiones in WinServer 2012R2

Sed ad praeliminarem debugging programmatis, quod discutiendum est, rationem cum administratoribus iuribus usus sum.

II. Program

Quaestio igitur enuntiatio: creans aliquod interface graphicum simplex coniungere ad sensum umbrae usoris cum eius permissione, nuntium ad usorem mittens. Vestibulum elit Lazarus eligitur.

1. Plenum domain nomen usorum "login" - "nomen plenum" obtinemus ab administratore, vel iterum per consolatorium:

wmic useraccount get Name,FullName 

ne hoc quidem vetat;

wmic useraccount get Name,FullName > c:testusername.txt

Dicam statim Lazarum esse qui problema huius limae expediendi habuit, quoniam per defectionem eius descriptam est UCS-2, sic ego iustus manually eam ad regularem UTF-8. Multum tabs in structura tabellae, vel potius multa spatia, quae programmatice procedere placuit, serius vel serius problema descriptam solvetur et tabella programmatice renovabitur.

Ita, idea est habere folder pervium programmatis utentibus, exempli gratia c:test, in quo erunt 2 tabulae: prima cum nomine et nomine, altera cum id_rdp et login usorum. Deinde, ut melius possumus:).

Interim, ut cum indice sessionum adiungas, haec contenta in ordinem transfermus;

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;

Paenitemus "multum codicis", sequentia puncta brevius erunt.

2. Eadem methodo e paragrapho superiore utens, exitum album expediendi in elementum StringGrid legimus, dum partem codicis "significat" dabo;

2.1 Praesens indicem sessionum RDP in tabella accipimus:

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 Processus tabella (lineae tantum significantes codicis indicantur);

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. Ipsum nexum directum strepitando in linea cum usore et numero sessionis eius:

  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. Duo ornamenta plura facta sunt, ut strepitando in radiobutton voluptua, nuntiis ad usorem vel ad omnes utentes.

Utilitas humanae umbrae nexum non administratorem RDP user sessiones in WinServer 2012R2

β†’ plena source code videri potest hic

III. Usura AdminLink - quod vidi:

AdminLink brevis quae indicat locum utilitatis generat admilaunch.exe, et exemplar personale utilitatis launch AdmiRun.Exe quae sita est in folder utentis, e.g Vasya, type C:UsersvasyaWINDOWS. In genere, non omnia mala sunt: ​​circumire potes accessu iurium ad fasciculi brevis et alios ad conscientiam tuam purgandam.

Source: www.habr.com