Utilidad para la conexión de sombra humana de no administrador a sesiones de usuario RDP en WinServer 2012R2

El problema durante el período de cuarentena de la empresa fue el siguiente: realmente es necesario minimizar el número de visitas a las oficinas de especialistas que brindan servicio y consultoría sobre software de aplicaciones y, francamente, los usuarios a menudo abusan de la ayuda de especialistas sin querer profundizar en Sobre el tema en sí, dicen “vendrán, ayudarán, lo harán, pero yo fumaré/tomaré café, etc.” La consulta telefónica al compartir un servidor es más efectiva si ve la pantalla remota.

Utilidad para la conexión de sombra humana de no administrador a sesiones de usuario RDP en WinServer 2012R2

Después de la “invención” de nuestra bicicleta, apareció información sensata sobre el tema del artículo: RDS Shadow: conexión oculta a sesiones de usuario RDP en Windows Server 2012 R2 o Modo sombra de usuario sin privilegios en el servidor de Windows o Gestión delegada de sesiones RDP. Todos ellos implican el uso de una consola, incluso con elementos de un simple diálogo.

Toda la información a continuación está destinada a aquellos que tolera perversiones anormales normalmente para obtener el resultado deseado, inventando métodos innecesarios.
Para no “tirar al gato por la cola”, empezaré por lo último: la bicicleta funciona para el usuario medio que utiliza la utilidad AdmiEnlace, por lo cual gracias a su autor.

I. Consola y RDP oculto.

Desde su uso con derechos de administrador de la consola del Administrador del Servidor -> QuickSessionCollection -> haciendo clic en la sesión del usuario de interés, seleccionando Sombra en el menú contextual Para el personal que instruye cómo utilizar el software., no es una opción, se consideró otro método “de madera”, a saber:

1. Descubra la identificación RDP de la sesión:

query user | findstr Administrator

o:

qwinsta | findstr Administrator 

Además "| Administrador de Findtr"Sólo era conveniente cuando sabías exactamente qué Administrador que necesita, o use solo la primera parte para ver a todos los que iniciaron sesión en el servidor.

Utilidad para la conexión de sombra humana de no administrador a sesiones de usuario RDP en WinServer 2012R2

2. Conéctese a esta sesión, siempre que en el dominio políticas de grupo La opción "Configurar reglas de control remoto para sesiones de usuario de Servicios de Escritorio remoto" está seleccionada con al menos la opción "Monitorear sesión con permiso de usuario" seleccionada (más):

mstsc /shadow:127

Tenga en cuenta que la lista solo contendrá los inicios de sesión de los usuarios.

Repito que sin derechos de administrador obtendrás lo siguiente:

Utilidad para la conexión de sombra humana de no administrador a sesiones de usuario RDP en WinServer 2012R2

Pero para la depuración preliminar del programa que se discutirá, utilicé una cuenta con derechos de administrador.

II. Programa

Entonces, el planteamiento del problema: crear una interfaz gráfica simple para conectarse al sentido de la sombra del usuario con su permiso, enviando un mensaje al usuario. El entorno de programación elegido es Lazarus.

1. Obtenemos la lista completa de dominios de usuarios "iniciar sesión" - "nombre completo" del administrador, o nuevamente a través de la consola:

wmic useraccount get Name,FullName 

nadie prohíbe ni siquiera esto:

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

Diré de inmediato que fue Lazarus el que tuvo problemas con el procesamiento de este archivo, ya que de forma predeterminada su codificación es UCS-2, por lo que solo tuve que convertirlo manualmente a UTF-8 normal. Hay muchas pestañas en la estructura del archivo, o más bien muchos espacios, que se decidió procesar mediante programación; tarde o temprano el problema de codificación se resolverá y el archivo se actualizará mediante programación.

Entonces, la idea es tener una carpeta accesible para los usuarios del programa, por ejemplo c:test, en la cual habrá 2 archivos: el primero con login y nombre completo, el segundo con id_rdp y login de usuarios. A continuación, procesamos estos datos lo mejor que podemos :).

Mientras tanto, para asociarnos con la lista de sesiones, transferimos este contenido (inicio de sesión y nombre completo) a una matriz:

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;

Pido disculpas por la "gran cantidad de código", los siguientes puntos serán más concisos.

2. Usando el mismo método del párrafo anterior, leemos el resultado del procesamiento de la lista en el elemento StringGrid, mientras le daré un fragmento de código "significativo":

2.1 Recibimos la lista actual de sesiones RDP en un archivo:

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 Procesar el archivo (solo se indican líneas de código significativas):

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. Conexión directa propiamente dicha haciendo clic en la línea con el usuario y su número de sesión:

  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. Se han realizado un par de decoraciones más, como ordenar haciendo clic en el botón de opción y mensajes para el usuario o para todos los usuarios.

Utilidad para la conexión de sombra humana de no administrador a sesiones de usuario RDP en WinServer 2012R2

→ Se puede ver el código fuente completo aquí

III. Usando AdminLink: lo que vi:

AdminLink genera un acceso directo que hace referencia a la ubicación de la utilidad admilaunch.exey una copia personal de la utilidad de inicio. AdmiRun.Exe que se encuentra en la carpeta del usuario, por ejemplo vasya, escribe C: UsuariosvasyaWINDOWS. En general, no todo es tan malo: puedes jugar con los derechos de acceso al archivo de acceso directo y otros para limpiar tu propia conciencia de administrador.

Fuente: habr.com

Añadir un comentario