WinServer 2012R2의 RDP 사용자 세션에 대한 관리자가 아닌 사람의 휴먼 섀도우 연결을 위한 유틸리티

기업의 방역 기간 동안 문제는 다음과 같았다. 응용 소프트웨어에 대한 서비스 및 컨설팅을 담당하는 전문가의 사무실 방문 횟수를 최소화하는 것이 정말로 필요했고, 솔직히 말해서 사용자들은 전문가의 도움을 남용하는 경우가 많다. 문제 자체에 대해 그들은 "그들이 올 것이다 – 그들이 도울 것이다 – 그들이 할 것이지만 나는 담배를 피우거나 커피를 마실 것이다 등등"이라고 말합니다. 서버 공유 시 전화 상담은 원격 화면을 보면 더욱 효과적입니다.

WinServer 2012R2의 RDP 사용자 세션에 대한 관리자가 아닌 사람의 휴먼 섀도우 연결을 위한 유틸리티

우리가 자전거를 "발명"한 후 기사 주제에 관한 건전한 정보가 나타났습니다. RDS 섀도우 – Windows Server 2012 R2의 RDP 사용자 세션에 대한 섀도우 연결 또는 Windows 서버의 권한 없는 사용자 섀도우 모드 또는 RDP 세션 관리 위임. 이 모든 것에는 간단한 대화 요소가 있더라도 콘솔을 사용하는 것이 포함됩니다.

아래의 모든 정보는 다음과 같은 사람들을 위한 것입니다. 비정상적인 변태를 정상적으로 용납합니다. 원하는 결과를 얻기 위해 불필요한 방법을 고안합니다.
"고양이의 꼬리를 잡아당기지" 않기 위해 마지막 것부터 시작하겠습니다. 자전거는 유틸리티를 사용하는 일반 사용자에게 적합합니다. 애드미링크, 저자에게 감사드립니다.

I. 콘솔 및 섀도우 RDP.

와 함께 사용 이후 서버 관리자 콘솔의 관리자 권한 -> QuickSessionCollection -> 관심 있는 사용자의 세션을 클릭하고 컨텍스트 메뉴에서 Shadow를 선택합니다. 소프트웨어 사용 방법을 교육하는 직원용, 옵션이 아니기 때문에 또 다른 "목재" 방법이 고려되었습니다.

1. 세션의 RDP ID를 확인합니다.

query user | findstr Administrator

또는 :

qwinsta | findstr Administrator 

게다가 "| findstr 관리자"정확히 무엇인지 알 때만 편리했어요. 관리자 서버에 로그인한 모든 사람을 보려면 필요하거나 첫 번째 부분만 사용하십시오.

WinServer 2012R2의 RDP 사용자 세션에 대한 관리자가 아닌 사람의 휴먼 섀도우 연결을 위한 유틸리티

2. 도메인에 있는 경우 이 세션에 연결합니다. 그룹 정책 최소한 "사용자 권한으로 세션 모니터링" 옵션이 선택된 상태에서 "원격 데스크톱 서비스의 사용자 세션에 대한 원격 제어 규칙 설정" 옵션이 선택되어 있습니다():

mstsc /shadow:127

목록에는 사용자 로그인만 포함됩니다.

관리자 권한이 없으면 다음과 같은 결과가 나타납니다.

WinServer 2012R2의 RDP 사용자 세션에 대한 관리자가 아닌 사람의 휴먼 섀도우 연결을 위한 유틸리티

하지만 앞으로 다룰 프로그램의 예비 디버깅을 위해서는 관리자 권한이 있는 계정을 사용했습니다.

II. 프로그램

따라서 문제 설명은 다음과 같습니다. 사용자의 허락을 받아 사용자의 그림자 감각에 연결하기 위한 간단한 그래픽 인터페이스를 만들고 사용자에게 메시지를 보냅니다. 선택한 프로그래밍 환경은 Lazarus입니다.

1. 관리자로부터 "로그인" - "전체 이름" 사용자의 전체 도메인 목록을 얻거나 콘솔을 통해 다시 얻습니다.

wmic useraccount get Name,FullName 

아무도 이것조차 금지하지 않는다:

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

이 파일을 처리하는 데 문제가 있었던 것은 Lazarus였다고 바로 말씀드리겠습니다. 기본적으로 인코딩은 UCS-2이므로 수동으로 일반 UTF-8로 변환해야 했습니다. 파일 구조에는 많은 탭이 있거나 프로그래밍 방식으로 처리하기로 결정된 공백이 많으며 조만간 인코딩 문제가 해결되고 파일이 프로그래밍 방식으로 업데이트됩니다.

따라서 아이디어는 프로그램 사용자가 액세스할 수 있는 폴더를 만드는 것입니다(예: c:test). 여기에는 2개의 파일이 있습니다. 첫 번째 파일은 로그인 및 전체 이름이 있고 두 번째 파일은 id_rdp 및 사용자 로그인이 있습니다. 다음으로, 우리는 이 데이터를 최선을 다해 처리합니다 :).

그 동안 세션 목록과 연결하기 위해 이(로그인 및 전체 이름) 내용을 배열로 전송합니다.

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;

"많은 코드"에 대해 사과드립니다. 다음 사항이 더 간결해질 것입니다.

2. 이전 단락과 동일한 방법을 사용하여 목록 처리 결과를 StringGrid 요소로 읽고 "중요한" 코드 조각을 제공합니다.

2.1 현재 RDP 세션 목록을 파일로 받습니다.

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 파일 처리(중요한 코드 줄만 표시됨):

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. 사용자 및 세션 번호가 있는 라인을 클릭하여 직접 연결합니다.

  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. 라디오 버튼을 클릭하여 정렬하고 사용자 또는 모든 사용자에게 보내는 메시지와 같은 몇 가지 추가 장식이 만들어졌습니다.

WinServer 2012R2의 RDP 사용자 세션에 대한 관리자가 아닌 사람의 휴먼 섀도우 연결을 위한 유틸리티

→ 전체 소스코드를 보실 수 있습니다 여기에

III. AdminLink 사용 - 내가 본 것:

AdminLink는 유틸리티 위치를 참조하는 바로가기를 생성합니다. admilaunch.exe및 실행 유틸리티의 개인 사본 AdmiRun.Exe 예를 들어 사용자 폴더에 있습니다. 바샤, 유형 C:사용자vasyaWINDOWS. 일반적으로 모든 것이 그렇게 나쁘지는 않습니다. 바로가기 파일 및 기타 파일에 대한 액세스 권한을 가지고 놀면서 자신의 관리자 양심을 비울 수 있습니다.

출처 : habr.com

코멘트를 추가