2013-08-20 3 views
2

Я работаю над пользовательским командлетом Powershell для доступа к веб-сервису REST.
Вебсервис требует, чтобы я аутентифицировался, и когда я это сделаю, он возвращает аутентификационный токен, который я должен включить в каждый запрос после этого.Custom Powershell Cmdlet - Создать скрытую доступную переменную

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сохранить токен желаемым образом, чтобы я мог легко использовать его в командах после аутентификации.

Я хотел бы, чтобы он мог работать так же, как Connect-MSOLService работа.
Для тех, кто не знаком с командлетами Office 365, я приведу несколько примеров.

Office 365 командлетов

$ Credentials = Get-Credential
Connect-MSOLService -Credential $ Credentials
Get-MSOLUser

В этом примере Get-MSOLUser вернется каждый пользователь Office 365, потому что Connect-MSOLService был вызван перед началом работы.

Моего Cmdlet

$ Credentials = Get-Credential
$ токены = Connect-WebService -Credential $ Credentials
Get-сервер -token $ токены
Get-Client -token $ фишки

Как вы можете видеть, я должен вернуть токен и сохранить его в переменной и использовать его в каждом вызове, который я делаю после аутентификации.

Таким образом, это приводит меня к моему вопросу, как я могу «ввести» токен в сеанс Powershell и использовать его «под капотом» для каждой команды в моем командлете/модуле после этого?

Благодарим вас за внимание.

ответ

0

Я не знаю, как Microsoft делает это, но я думаю, что один из способов сделать это так:

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 
) 
} 

Этот способ будет работать, если вы делаете все, что в модуле PowerShell.

+0

Одна вещь, о которой я забыл упомянуть, это то, что я пишу Командлет в C#. Я проверю, можно ли вводить переменные глобальным переменным в коде C#. – Keb

+0

После некоторых мыслей, даже если бы я смог получить токен-трафик для глобальных переменных, мне все равно нужно было бы выполнять команды, такие как Get-Service -token $ token, но спасибо за ваше предложение. – Keb

+0

Я просто помнил, что PowerShell также имеет переменные с переменными, которые будут работать. Я просто не знаю, как это работает внутри C# Cmdlet, поскольку я никогда не писал его. Есть ли конкретная причина, по которой вы пишете ее на C#, а не в PowerShell? –

2

Вы должны быть осторожны при хранении токена в переменной процесса, так как в одном процессе можно использовать несколько пространств PowerShell. Однако то, что вы могли бы сделать, это создать статическую ссылку на словарь, который ставит маркер для рабочей области, в которой работает командлет.Вы можете получить пространство выполнения 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, но будет сохраняться между командлетов вызовов. Я использую его для хранения маркера API в первом запросе и повторного использования его до истечения срока его действия или закрытия сеанса.

Смежные вопросы