원격 Powershell 세션에서 자격 증명을 유지하는 방법은 무엇입니까?


13

Azure 파일 공유가 있고 cmdkey를 사용하여 VM에서 자격 증명을 유지하고 순 사용으로 마운트 한 후 Azure VM에서이를 사용하려고합니다. Windows Server 2012 R2의 로컬 Powershell 세션에서 이러한 명령을 실행하여 테스트했습니다.

그러나이 단계를 Azure 배포 스크립트에 추가해야합니다. Azure Powershell 스크립트는 내 랩톱에서 실행되며 Azure 구독에 연결하고 많은 변수를 사용하여 처음부터 VM을 빌드합니다.

Invoke-Command를 사용하여 Azure Powershell 스크립트의 변수를 새로 만든 VM의 원격 Powershell 세션으로 전달하는 것으로 나타났습니다.

$Session = New-PSSession -ConnectionUri $Uri -Credential $DomainCredential

$ScriptBlockContent = { 
Param ($Arg1,$Arg2,$Arg3)
cmdkey /add:$Arg1 /user:$Arg2 /pass:$Arg3}

Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)

그리고 오류 :

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)
CMDKEY: Credentials cannot be saved from this logon session.

구문을 확인하기 위해 cmdkey / list로 대체되었으며 오류가 없습니다.

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent
Currently stored credentials:
* NONE *

VM의 로컬 Powershell 세션에서 제대로 실행되지만 원격 Powershell을 통해 시작할 때 업데이트되지 않는 Windows Update PowerShell 모듈 (Invoke-WUInstall)과 비슷한 문제가 있었지만이를 해결할 수 없었습니다.

이 문제를 해결할 방법이 있습니까?

답변:


2

Windows가 인증을 처리하는 방식으로 인해 CMDKEY를 사용하여 원격 PowerShell 세션을 통해 자격 증명을 설정할 수 없으므로 CMDKEY를 사용할 때 대화식으로 수행해야합니다.

스레드에서 Don Jones 를 인용 하여 비슷한 답변을 찾으십시오.

그것은 실제로 PowerShell 일이 아니라 Cmdkey 명령의 한계입니다. 그러나 Remotig가 자격 증명을 처리하는 방식과 관련이 있습니다. 원격 세션은 실제로 자격 증명을 얻지 못하고 위임 된 티켓을 얻으므로 실제로 저장할 토큰이 없습니다. 이것은 모두 의도적으로 설계된 것이며 재구성 할 수있는 것은 아닙니다.


2

예약 된 작업을 사용하지 않으려면 Sysinternal의 PsExec.exe를 사용할 수 있습니다 . 일반적으로 PowerShell 세션을 시작 하면 cmdkey에 실패한 로컬 사용자 대신 services프로세스 에서 실행됩니다 ( query session원격 컴퓨터 에서 명령을 실행하여이를 확인할 수 있음).

이를 극복하기 위해, 우리는 사용하여 수행 할 수있는 로컬 사용자의 프로세스에서 실행 cmdkey.exe 필요 PsExec.exe's -i플래그를하는

원격 시스템에서 지정된 세션의 데스크탑과 상호 작용하도록 프로그램을 실행하십시오. 세션이 지정되지 않으면 프로세스가 콘솔 세션에서 실행됩니다.

이제 원격 컴퓨터에서 로컬 사용자의 세션 ID를 얻는 것이 문제입니다. query session컴퓨터에서 활성화 된 세션 목록을 제공하는 명령을 실행하여이를 달성했습니다 . 가능한 해결책 중 하나는-

$processId = Invoke-Command $session -ScriptBlock  {
param($user)
    $sessions = query session $user;
    return $sessions[1].split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)[2];

} -ArgumentList ($user)

여기 $user에는 원격 컴퓨터에서 로컬 사용자의 사용자 이름이 포함됩니다.

세션 ID를 받으면 간단히 실행할 수 있습니다.

PsExec \\<computer_name> -u <local_user_name> -p <password> -h -i $processId cmdkey.exe /generic:testtt /user:userr /pass:pass

노트 :

  1. 원격 시스템에서 사용자의 세션 ID를 얻는 더 좋은 방법이있을 수 있습니다.
  2. 현재 PsExec을 실행하는 동안 피할 수있는 원격 시스템과 다시 연결하고 있습니다 (테스트하지 않았습니다).
  3. 명령을 실행하는 사용자는 원격 시스템에 대한 관리자 액세스 권한이 있어야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.