2013-08-20 39 views
2

我正在处理用于访问REST Web服务的自定义Powershell Cmdlet。
Web服务要求我进行身份验证,并且当我这样做时,会返回一个authenticaton令牌,之后我必须包含每个请求中的身份验证令牌。自定义Powershell Cmdlet - 创建隐藏的可访问变量

我面临的问题是我无法以所需的方式存储令牌,所以我可以在身份验证后轻松地在命令中使用它。

我想如果它可以像Connect-MSOLService一样工作。
对于那些不熟悉Office 365 cmdlet的人,我会举几个例子。

的Office 365的cmdlet

$证书= GET-凭证
连接,MSOLService -Credential $证书
GET-MSOLUser

在这个例子中的Get-MSOLUser将返回每个Office 365用户,因为Connect-MSOLService已事先被调用。

我Cmdlet的

$证书= GET-凭证
$令牌=连接,WebService的-Credential $证书
GET-服务器-token $令牌
获取客户端-token $令牌

正如你所看到的,我必须返回令牌并将其存储在一个变量中,并在验证后的每次调用中使用它。

因此,这导致我的问题,我怎么能注入到Powershell会话中的令牌,然后在我的cmdlet /模块中的每个命令中使用它“引擎盖下”?

谢谢你的时间。

回答

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中工作,因为我从来没有写过。是否有一个特定的原因,你正在编写它在C#中,而不是在PowerShell? –

2

因为可能在同一进程中运行多个PowerShell运行空间,所以必须小心将该令牌存储在进程范围变量中。但是,您可以执行的操作是创建一个静态引用,以便为运行cmdlet的运行空间存储令牌。你可以运行空间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来存储变量。您可以使用GetValue()来检索它。

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

这个变量是提供给PowerShell会话,但小命令调用之间将继续存在。我使用它来在第一个查询中存储API令牌,并在它过期或会话关闭之前重用它。