Using explicit credentials with PowerShell cmdlets
There are several PowerShell and Exchange Management Shell cmdlets that provide a credential parameter that allows you to use an alternate set of credentials when running a command. You may need to use alternate credentials when making manual remote shell connections, sending e-mail messages, working in cross-forest scenarios, and more. In this recipe, we'll take a look at how you can create a credential object that can be used with commands that support the -Credential
parameter.
How to do it...
To create a credential object, we can use the Get-Credential
cmdlet. In this example, we store the credential object in a variable that can be used by the Get-Mailbox
cmdlet:
$credential = Get-Credential Get-Mailbox -Credential $credential
How it works...
When you run the Get-Credential
cmdlet, you are presented with a Windows authentication dialog box requesting your username and password. In the previous example, we assigned the Get-Credential
cmdlet to the $credential
variable. After typing your username and password into the authentication dialog box, the credentials are saved as an object that can then be assigned to the -Credential
parameter of a cmdlet. The cmdlet that utilizes the credential object will then run using the credentials of the specified user.
Supplying credentials to a command doesn't have to be an interactive process. You can programmatically create a credential object within your script without using the Get-Credential
cmdlet:
$user = "contoso\administrator" $pass = ConvertTo-SecureString -AsPlainText P@ssw0rd01 -Force $credential = New-Object System.Management.Automation.PSCredential ` -ArgumentList $user,$pass
You can see here that we've created a credential object from scratch without using the Get-Credential
cmdlet. In order to create a credential object, we need to supply the password as a secure string type. The ConvertTo-SecureString
cmdlet can be used to create a secure string object. We then use the New-Object
cmdlet to create a credential object specifying the desired user name and password as arguments.
If you need to prompt a user for their credentials but you do not want to invoke the Windows authentication dialog box, you can use this alternative syntax to prompt the user in the shell for their credentials:
$user = Read-Host "Please enter your username" $pass = Read-Host "Please enter your password" -AsSecureString $credential = New-Object System.Management.Automation.PSCredential ` -ArgumentList $user,$pass
This syntax uses the Read-Host
cmdlet to prompt the user for both their username and password. Notice that when creating the $pass
object we use Read-Host
with the -AsSecureString
parameter to ensure that the object is stored as a secure string.
There's more...
After you've created a credential object, you may need to access the properties of that object to retrieve the username and password. We can access the username and password properties of the $credential
object created previously using the following commands:
You can see here that we can simply grab the username stored in the object by accessing the UserNameproperty
of the credential object. Since the Password
property is stored as a secure string, we need to use the GetNetworkCredential
method to convert the credential to a NetworkCredential
object that exposes the Password
property as a simple string.