Utilitário para conexão shadow não administrativa com sessões RDP de usuários no WinServer 2012R2

O problema durante o trabalho remoto da empresa se tornou o seguinte: realmente é necessário minimizar o número de visitas aos escritórios pelos especialistas que atendem e consultam sobre software aplicado, além do mais, para ser sincero, os usuários muitas vezes abusam da ajuda dos especialistas sem querer se envolver na questão, tipo 'eles vêm — ajudam — resolvem, enquanto eu fumo / tomo café, etc.'. A consulta por telefone, durante o acesso conjunto ao servidor, é mais eficaz se você visualizar a tela remota.

Utilitário para conexão shadow não administrativa com sessões RDP de usuários no WinServer 2012R2

Já após a 'invenção' do nosso próprio estilo, surgiu informação adequada sobre o tema do artigo: RDS Shadow – conexão shadow com sessões RDP de usuários no Windows Server 2012 R2 ou Modo shadow de usuário não privilegiado no Windows Server ou Delegar o gerenciamento de sessões RDP. Todos eles implicam o uso de um console, mesmo com elementos de um diálogo simples.

Toda a informação apresentadaa abaixo é destinada àqueles que suportam normalmente aberrações anormais para obter o resultado desejado, inventando meios desnecessários.
Para 'não enrolar', começarei pelo final: a ferramenta funciona para um usuário comum com a utilização do AdmiLink, pelo que agradecemos ao seu autor.

I. Console e shadow RDP.

Como o uso com permissões administrativas do console Server Manager -> QuickSessionCollection -> clicando na sessão do usuário em questão, escolhendo no menu de contexto Shadow (Cópia Sombreamento) para o pessoal que instrui sobre o uso de software, — não é uma opção, foi considerado outro método 'rústico', a saber:

1. Encontrar o ID da sessão RDP:

query user | findstr Administrator

ou:

qwinsta | findstr Administrator 

A parte "| findstr Administrator" foi conveniente apenas quando você sabe que realmente Administrator é o que você precisa, ou usar apenas a primeira parte para ver todos os usuários logados no servidor.

Utilitário para conexão shadow não administrativa com sessões RDP de usuários no WinServer 2012R2

2. Conectar-se a esta sessão, desde que nas políticas de grupo de domínio o parâmetro 'Estabelece regras de gerenciamento remoto para sessões de usuário dos serviços de área de trabalho remota' esteja definido, no mínimo, como 'Observação da sessão com permissão do usuário' ( mstsc /shadow:127mais detalhes):

Por favor, observe que a lista mostrará apenas os logins dos usuários.

Por favor, note que na lista estarão apenas os logins dos usuários.

Reitero que sem direitos de administrador você terá o seguinte:

Utilitário para conexão shadow não administrativa com sessões RDP de usuários no WinServer 2012R2

Mas para a depuração inicial do programa em questão, usei uma conta com privilégios de administrador.

II. Programa

Assim, a proposta é: criar uma interface gráfica simples para conexão com o sensor sombrio do usuário com sua permissão, enviando uma mensagem ao usuário. O ambiente de programação escolhido foi o Lazarus.

1. Obtendo uma lista completa de domínios de usuários «login» — «nome completo» com o administrador, ou novamente através do console:

wmic useraccount get Name,FullName 

ninguém proíbe fazer assim também:

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

Posso dizer de imediato que o Lazarus teve um problema ao processar esse arquivo, pois sua codificação padrão é UCS-2, portanto, foi necessário convertê-lo manualmente para UTF-8 comum. A estrutura do arquivo contém muitas tabulações, ou melhor, muitos espaços, que decidimos processar programaticamente. Tarde ou cedo, o problema com a codificação será resolvido e o arquivo será atualizado programaticamente.

Assim, a ideia é ter uma pasta acessível aos usuários do programa, por exemplo, c:test, onde haverá 2 arquivos: o primeiro com login e nome completo, e o segundo com id_rdp e login dos usuários. A seguir, processamos esses dados como pudermos:).

Enquanto isso, para associar com a lista de sessões, transferimos este (login e nome completo) conteúdo para um array:

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('Erro ao processar o arquivo. Detalhes: '+E.Message);
 end;end;

Peço desculpas pelo "muito código", os próximos pontos serão mais concisos.

2. Da mesma forma que no método do ponto anterior, lemos o resultado do processamento da lista no elemento StringGrid, apresentando um "trecho significativo" do código:

2.1 Obtemos a lista atual de sessões RDP em um arquivo:

f1:=f_d+'user.txt';
cmdline:='\/c query user >'+ f1;
if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1)=0 then;
Sleep(500); \/\/ podemos esperar mais um pouco enquanto o arquivo para leitura é criado

2.2 Processamos o arquivo (apenas as linhas significativas do código estão indicadas):

StringGrid1.Cells[0,i]:=fL[1]; StringGrid1.Cells[2,i]:=fL[3]; \/\/ adicionamos em um loop no StringGrid1
login1:=StringReplace(fL[1],' ','',[rfReplaceall, rfIgnoreCase]); \/\/ removemos os espaços do login
if (SearchArr(login1)>=0) then \/\/ buscamos no array do ponto 1. o login e gravamos na tabela de nome completo
StringGrid1.Cells[1,i]:=fam[1,SearchArr(login1)]
else StringGrid1.Cells[1,i]:='+'; \/\/ ou gravamos um sinal de mais:)
.... \/\/ dependendo da escolha do usuário, ordenamos e formatamos os dados
if (b_id.Checked=true) then SortGrid(0) else SortGrid(1);
StringGrid1.AutoSizeColumn(0);StringGrid1.AutoSizeColumn(1); StringGrid1.AutoSizeColumn(2);  

3. A conexão propriamente dita ao clicar na linha do usuário e no número da sua sessão:

  id:=(StringGrid1.Row);\/\/ obtemos o número da linha  IntToStr(StringGrid1.Row)
  ids:=StringGrid1.Cells[2,id]; \/\/ obtemos o identificador rdp
  cmdline:='\/c mstsc \/shadow:'+ ids; \/\/ e nos conectamos....
 if (b_rdp.Checked=True) then  if ShellExecute(0,nil, PChar('cmd'),PChar(cmdline),nil,1) =0 then;       

4. Foram feitas algumas melhorias, como a ordenação ao clicar no botão de opção, e mensagens para o usuário ou para todos os usuários.

Utilitário para conexão shadow não administrativa com sessões RDP de usuários no WinServer 2012R2

→ O código-fonte completo pode ser visualizado aqui

III. Uso do AdminLink — o que eu vi:

O AdminLink realmente gera um atalho que se refere à localização da ferramenta admilaunch.exe, e a cópia pessoal da ferramenta executável AdmiRun.Exe que está na pasta do usuário, por exemplo vasya, no estilo de C:UsersvasyaWINDOWS. De modo geral, não é tão ruim: com os direitos de acesso ao arquivo do atalho e outros, para limpar sua própria consciência administrativa, pode-se brincar.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster