2013-08-20 38 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令牌,並在它過期或會話關閉之前重用它。