2013-08-20 2 views
2

나는 REST 웹 서비스에 액세스하기 위해 사용자 지정 Powershell Cmdlet에서 작업하고 있습니다.
webservice를 사용하려면 인증을 받아야합니다. 그러면 인증 요청 후에 모든 요청에 ​​포함해야하는 authenticaton-token을 반환합니다.사용자 지정 Powershell Cmdlet - 숨김 액세스 가능한 변수 만들기

내가 직면하고있는 문제는 원하는 방식으로 토큰을 저장할 수 없어서 인증 후 명령에서 쉽게 사용할 수 있다는 것입니다.

Connect-MSOLService과 동일한 방식으로 작동 할 수 있다면 좋겠다.
Office 365 cmdlet에 익숙하지 않은 사용자를 위해 몇 가지 예를 제공 할 것입니다.

사무실 365 사람 cmdlet

$ 자격 증명 = 얻기-자격 증명을
연결-MSOLService -Credential $ 자격 증명은 Get-MSOLUser 반환이 예제에서는
가져 오기 - MSOLUser

모든 Office 365 사용자는 Connect-MSOLService가 직접 호출되기 때문에

내 Cmdlet를

$ 자격 증명 =
$ 토큰 = 연결-WebService를 -Credential $ 자격 증명
가져 오기 - 서버 -token $ 토큰
가져 오기 - 클라이언트 -token $ 토큰 자격 증명을 받기

위에서 알 수 있듯이 토큰을 반환하고 변수에 저장하고 인증 후 모든 호출에서 사용해야합니다.

그렇다면 Powershell 세션에 토큰을 "주입"하고 그 후에 내 cmdlet/모듈의 모든 명령에 "under-the-hood"를 사용할 수 있습니까?

감사합니다.

답변

0

나는 마이크로 소프트가 어떻게하는지 모르겠지만, 나는이처럼 한 가지 방법 생각 : 당신이 PowerShell을 모듈에서 모든 일을하는 경우

function Connect-WebService { 
    param($credential) 

    #Do all of the connection here 


    #Set the global variable so it will be available outside of this function 
    $script:token = ... 
} 

function Get-Server { 
    param(
     $token = $script:token # By default use the globally set $token variable 
) 
} 

이 방법이 작동 것입니다.

+0

내가 언급 한 것을 잊어 버린 한 가지는 C#으로 Cmdlet을 작성하고 있다는 것입니다. C# 코드 내의 전역 변수에 변수를 주입 할 수 있는지 확인합니다. – Keb

+0

몇 가지 생각을하고 난 후에도 전역 변수에 토큰 인을 가져올 수 있다고하더라도 Get-Service -token $ token과 같은 명령을 수행해야하지만 사용자의 제안에 감사드립니다. – Keb

+0

저는 PowerShell에도 스크립트 유효 범위 변수가 있다는 것을 기억했습니다. C# Cmdlet 내에서 어떻게 작동하는지 알지 못합니다. PowerShell이 ​​아닌 C#으로 작성하는 특별한 이유가 있습니까? –

2

동일한 프로세스에서 여러 PowerShell 실행 영역을 실행할 수 있으므로 프로세스 와이드 변수에 토큰을 저장하는 데주의해야합니다. 그러나 수행 할 수있는 작업은 cmdlet이 실행중인 runspace에 대한 토큰을 숨기는 Dictionary에 대한 정적 참조를 만드는 것입니다.당신은 너무처럼 실행 영역의 ID를 얻을 수 있습니다 :

Guid runspaceId = Guid.Empty; 
using (var ps = PowerShell.Create(RunspaceMode.CurrentRunspace)) 
{ 
    runspaceId = ps.Runspace.InstanceId; 
} 

는 다음과 같이 정적 읽기 전용 필드 정적 클래스를 만들 : 기존 토큰

public static class TokenUtil { 
    public static readonly Dictionary<Guid,PSObject> Tokens = new Dictionary<Guid,PSObject>(); 
} 

확인이 실행 영역에 대한과 같이 :

PSObject token = null; 
if (TokenUtil.Tokens.ContainsKey(runspaceId)) 
{ 
    token = TokenUtil.Tokens[runspaceId]; 
} 
0

PowerShell 5.0 어셈블리를 사용하는 경우 PSCmdlet에서 상속하고 SessionState을 사용하여 변수를 저장할 수 있습니다.

private string const variableName = "MyVar"; 
private Token token = new Token("your token"); 
SessionState.PSVariable.Set(new PSVariable(variableName, token, ScopedItemOptions.Private)); 

당신은 다음을 검색 할 수 GetValue()를 사용합니다.

Token storedToken = (Token)SessionState.PSVariable.GetValue(variableName); 

이 변수는 PowerShell 세션을 사용할 수 하지하지만 cmdlet을 호출 사이에 지속됩니다. API 토큰을 첫 번째 쿼리에 저장하고 만료되거나 세션이 닫힐 때까지 다시 사용합니다.

관련 문제