【问题标题】:Store credentials on button在按钮上存储凭据
【发布时间】:2018-11-23 22:16:02
【问题描述】:

为了让新员工更容易通过 powershell 连接到 Exchange,我正在使用 powershell:winforms 编写一个快速的小工具。

该工具将仅包含几个按钮、文本字段和信息文本,因此用户可以从一个 UI 管理 Exchange 环境。

#1  Set Credentials Button
$Set_Credential = New-Object System.Windows.Forms.Button
$Set_Credential.Top = "5"
$Set_Credential.Left = "5"
$Set_Credential.Anchor = "Left,Top"
$Set_Credential.Text = 'Set Credentials'
$Set_Credential.add_Click({
$UserCredential = Get-Credential
})
$Exchange_Manager.Controls.Add($Set_Credential)

#3  Connect to Exchange Online
$Exchange_Connect = New-Object System.Windows.Forms.Button
$Exchange_Connect.Top = "5"
$Exchange_Connect.Left = "150"
$Exchange_Connect.Anchor ="Left,Top"
$Exchange_Connect.Text = 'Connect' 
$Exchange_Connect.add_Click({
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential "$UserCredential" -Authentication Basic -AllowRedirection
Import-PSSession $Session
})
$Exchange_Manager.Controls.Add($Exchange_Connect)

如您所见,第一个“设置凭据”按钮允许用户通过默认的 get-credentials 输入凭据。

第二个按钮“连接到 Exchange”使用 $UserCredentials 启动新的 PSSession 登录。

我面临的问题是,当按下连接按钮时,我收到一条错误消息,提示 -credential 值为 Null。

查询 $UserCredential 也会得到一个空行。

似乎尽管输入了凭据,但它们并没有被存储,因为它们是通过按钮功能调用的。

我尝试查找它,但大多数答案都很模糊。

完整代码:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$Exchange_Manager = New-Object Windows.Forms.Form

#Session Initation 1
#1  Set Credentials Button
    $Set_Credential = New-Object System.Windows.Forms.Button
    $Set_Credential.Top = "5"
    $Set_Credential.Left = "5"
    $Set_Credential.Anchor = "Left,Top"
    $Set_Credential.Text = 'Set Credentials'
    $Set_Credential.add_Click({
         $UserCredential = Get-Credential
    })
    $Exchange_Manager.Controls.Add($Set_Credential)
#2  Current Credentials

#3  Connect to Exchange Online
    $Exchange_Connect = New-Object System.Windows.Forms.Button
    $Exchange_Connect.Top = "5"
    $Exchange_Connect.Left = "150"
    $Exchange_Connect.Anchor ="Left,Top"
    $Exchange_Connect.Text = 'Connect' 
    $Exchange_Connect.add_Click({
        $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential "$UserCredential" -Authentication Basic -AllowRedirection
        Import-PSSession $Session
    })
    $Exchange_Manager.Controls.Add($Exchange_Connect)










#Information
#1  Set Credentials Button
    $Mailboxes = New-Object System.Windows.Forms.Button
    $Mailboxes.Top = "50"
    $Mailboxes.Left = "5"
    $Mailboxes.Anchor = "Left,Top"
    $Mailboxes.Text = 'Get All Mailboxes'
    $Mailboxes.add_Click({
         Get-Mailbox |Select-Object DisplayName, Alias | Sort-Object -Property DisplayName | Out-gridview
    })
    $Exchange_Manager.Controls.Add($Mailboxes)




$Exchange_Manager.ShowDialog()

【问题讨论】:

    标签: winforms powershell powershell-2.0 exchange-server powershell-3.0


    【解决方案1】:

    您需要将$UserCredential 设为全局。

    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    
    $Exchange_Manager = New-Object Windows.Forms.Form
    $Exchange_Manager.TopMost = $true
    
    # create a global empty credential object
    $Global:UserCredential = [System.Management.Automation.PSCredential]::Empty
    
    #Session Initation 1
    #1  Set Credentials Button
        $Set_Credential = New-Object System.Windows.Forms.Button
        $Set_Credential.Top = "5"
        $Set_Credential.Left = "5"
        $Set_Credential.Anchor = "Left,Top"
        $Set_Credential.Text = 'Set Credentials'
        $Set_Credential.add_Click({
             $Global:UserCredential = Get-Credential
        })
        $Exchange_Manager.Controls.Add($Set_Credential)
    
    #2  Current Credentials
    
    
    #3  Connect to Exchange Online
        $Exchange_Connect = New-Object System.Windows.Forms.Button
        $Exchange_Connect.Top = "5"
        $Exchange_Connect.Left = "150"
        $Exchange_Connect.Anchor ="Left,Top"
        $Exchange_Connect.Text = 'Connect' 
        $Exchange_Connect.add_Click({
            if ($Global:UserCredential -ne [System.Management.Automation.PSCredential]::Empty) {
                $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential "$Global:UserCredential" -Authentication Basic -AllowRedirection
                Import-PSSession $Session
            }
        })
        $Exchange_Manager.Controls.Add($Exchange_Connect)
    
    #4  Show the dialog and dispose of it afterwards
        $Exchange_Manager.ShowDialog()
        $Exchange_Manager.Dispose()
    

    【讨论】:

    • 谢谢!!!通过使用以下方法使其成为全局变量:#$UserCredential = Set-Variable -Name "UserCredential" -Value (Get-Credential) -Scope global # 变量现在可以从脚本中的任何位置读取。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多