Get-Credential创建字符串对象而不是PSCredential对象(Powershell)

时间:2014-10-21 22:18:25

标签: .net winforms powershell

我试图理解为什么我的某些代码不起作用。 (对于程序而言)的想法是让我使用当前用户进行操作,除非该用户单击按钮来更改他们用于提交操作的信用。我可以用另一种方式给这只猫上皮,但我很好奇为什么一段代码似乎有两种不同的结果。这是(请注意,所有写主机条目都是我试图跟踪流程):

try{
        $current_credentials = Get-Credential -Credential "ACME.COM\"
        write-host $current_credentials.gettype()
    }
    catch{
        $current_Credentials = $Env:Username
        write-host "catch"
    }
    finally{
        write-host $current_credentials.gettype()
        if($current_Credentials.Gettype().name -eq "PSCredential"){
            $Label_Credentials_Data.Text = $current_Credentials.username
            write-host "PSCred"
        }
        elseif($current_Credentials.Gettype().name -eq "String"){
            $Label_Credentials_Data.Text = $current_Credentials
            write-host "elseif"
        }
        else{
            $Label_Credentials_Data.Text = "ERROR!"
        }
        $Label_Credentials_Data.refresh()
    }

现在注意几点:$ current_Credentials首先初始化为$ env:username。对象$ Label_Credentials_Data是System.Windows.Forms.Label对象类型。

为了测试这个,我启动了另一个Powershell终端,以通常的方式初始化了$ current_credentials,并创建了一个ps对象,其属性为'text',方法为'refresh'(只是代码将按原样运行)。

如果我在其脚本中运行上面的代码,标签文本将变为“System.Management.Automation.PSCredential”,但如果我通过在新的终端窗口中复制和粘贴来运行它,我会正确获取$ current_credentials.username值。脚本中的gettype返回System.String两次,但在另一个终端中,我得到System.Management.Automation.PSCredential两次。

我无法理解我在这里做错了什么。我甚至将复制的代码包装成一个函数,看看它是否相关。

脚本:

System.String
System.String
elseif

复制并粘贴:

System.Management.Automation.PSCredential
System.Management.Automation.PSCredential
PSCred

编辑:对于未来的读者 - 这里有一些代码在评论中被引用。检查数据的编辑历史记录。

1 个答案:

答案 0 :(得分:1)

也许不是答案,但对评论来说太过分了。我最好的猜测是你有一些范围问题。听起来它是以某种方式获取System.String对象类型,当您将对象设置为$ env:username时该对象类型。这是我的建议:

不是我推荐的,但实际上你可以把它变成一个字符串。用户名,作为属性,作为System.String类型。您可以将Get-Credentials命令传递给| Select -ExpandProperty UserName,这将导致$current_credentials仍为字符串。问题是,如果您想要实际使用用户刚刚指定的那些凭据,您已经放弃了实际的PSCredential对象而不是仅保留UserName字符串,那么您必须让它们稍后再次输入凭据。

我建议使用另一个变量作为凭据,然后将UserName属性传递给$ current_credentials。类似的东西:

try{
    $tmpCreds = Get-Credential -Credential "ACME.COM\"
    $current_credentials = $tmpCreds.UserName
}
catch{
    $current_Credentials = $Env:Username
}
finally{
    $Label_Credentials_Data.Text = $current_Credentials
    $Label_Credentials_Data.refresh()
}