In this post we will look at some of the mechanics behind creating a profile file which will customise the start-up behaviour of the Integrated Scripting Environment (ISE). This will also serve as a precursor to additional posts on tweaking ISE for Exchange purposes. The catalyst for writing this was twofold. Firstly, an administrator was having issues trying to get ISE to process a profile script, and secondly, they were not connecting to Exchange PowerShell in a supported manner.
We will start off by looking at the default configuration, and seeing what happens with ISE when we use the location a lot of folks place their profile content in. This is the $PROFILE location in Windows PowerShell.
The below screenshots are taken from a Windows 2008 R2 SP1 server. Initially there are no PowerShell profiles on the system. We are piping the $PROFILE variable to Format-List with the –FORCE parameter to show all of the profile paths. Running $PROFILE on its own does not show all this detail.
$Profile | Format-List –Force
Let’s go ahead and create a profile script in the $PROFILE location. This is what the administrator I was working with was doing.
Creating PowerShell Profile
In the $PROFILE location, let’s create a script file that contains the below code. This will write a phrase to the screen at the start and end of the profile script. Additionally, it creates a variable called $Zorg that we can retrieve for testing purposes.
Write-Host “Starting profile” –ForegroundColor Magenta
$Zorg = “I am Zorg!”
Write-Host “Completed Profile” –ForegroundColor Blue
The file is created and saved:
We can confirm the file is present in the directory.
Sweet! let’s test this badboy in Windows PowerShell.
Testing In Windows PowerShell
Note that the script execution policy must be set to allow scripts to run. Installing Exchange will set this automatically. Else Set-ExecutionPolicy can be executed from an elevated Windows PowerShell session. When we then launch Windows PowerShell, the profile file is processed.
Yay!! All is good and now we can just load it up in ISE? Right?
Well not so much…..
Firing Up ISE
Launching ISE on the server produces less than spectacular results. In fact, there is nothing.
Did we not just see that the profile script was successfully launched? Where is the disconnect?
Let’s go back and double check our file information.
Checking PowerShell Paths
Take a look at $Profile inside ISE. Does it not have a $Profile variable??
<Phinius and Ferb>
Yes, Yes it does!
</Phinius and Ferb>
But is exactly the same?
This is the ISE $Profile
Compare this to the PowerShell $Profile
The files are in the same directory. But note that the there is a difference between the file names.
Let’s remove the windows PowerShell profile and put our settings into the ISE profile.
Firing Up ISE – Take 2
This time we have what we are looking for!
In the ISE results pane, we can see the starting and completed text. In addition, we can also see that there is a variable called $Zorg and the contents are retuned as expected.
Looking at the article How to Use Profiles in Windows PowerShell ISE we can see that it references the profile types that are supported.
|Current user, PowerShell ISE||$profile.CurrentUserCurrentHost, or $profile|
|“All users, PowerShell ISE”||$profile.AllUsersCurrentHost|
|“Current user, All hosts”||$profile.CurrentUserAllHosts|
|“All users, All hosts”||$profile.AllUsersAllHosts|
The designers or PowerShell were smart! They gave us the capability to have different profile files. Some apply universally across the server to all of the PowerShell hosts that are executed on that particular server. Some are user and host specific. In other words, we need to ensure that we are using the correct PowerShell profile script for the correct purpose.
In this post’s initial example, we had a disconnect between the $PROFILE variable which is the “current user, current host”. There is a “current user, current host” profile script for BOTH ISE and also for Windows PowerShell.
A similar concept existed for VBScript as it could be hosted in Windows Scripting Host (WSH) or Internet Explorer. Though it kind of lacked profile files, and a lot of other things as well compared to PowerShell….
If we look at examples of where the Windows PowerShell and ISE profile scripts are located, we can see that some of the profiles align and some do not. Files which align are the AllHosts ones as they apply to all of the environments that can host PowerShell on a specific server.
Windows PowerShell Profile Locations
$profile.CurrentUserCurrentHost ($Profile )
ISE PowerShell Profile Locations
$profile.CurrentUserCurrentHost ($Profile )
The key takeaway is that you need to use the right profile for the right purpose. Should you only want the profile script to apply to Windows PowerShell then use either one of the CurrentHost profiles. However, if the profile script is to only apply when using ISE then leverage one of the PowerShellISE profiles.
In the below example the same profile settings should apply to all instances on the server. Thus, the AllUsersAllHosts profile was used.
In the below screenshot you can see that the Exchange Management Shell, Windows PowerShell and ISE have all processed the AllUsersAllHosts profile script.
In the next post we will see how to connect to Exchange 2010 and 2013 Remote PowerShell using ISE.
Happy profile scripting!