Snazzy OSD status with BGInfo
This Blog post was created by Michael Schmidt.
Controlling the look and feel throughout OSD a very important part of creating a good user experience. Not only is the out-of-box experience a bit bland, it’s unfamiliar and confusing to someone who’s never experienced OSD before. Our goal in this article is to outline how to spice up the end-to-end deployment experience.
At a glance, a user should be able to tell:
- What’s going on?
- Where am I in the overall scheme of things?
Should the deployment go awry, these questions become even more important. In one glance, without looking at logs, anyone viewing the screen can answer questions such as:
- Where did the machine fail?
- What is the machine name?
- Does it have an IP address?
With BGInfo, the available information to display is nearly limitless; you have complete control over what details are visible and important to your organization.
A mockup of what might be used to accomplished this goal is shown below:
All this is possible through the use of BGInfo. With this utility, the background screen can be changed at any point in your Task Sequence.
In the mockup provided, the following practices were taken:
- Branding was provided to create familiarity and provide context for what is taking place
- Progress was grouped into 5 phases: System Backup, Install Image, Windows Setup, Install Applications, and Restore Backup
- One background bitmap was created for each phase; each time a phase completes, the background is changed
So, in the example given, 5 bitmaps were created. Thus, BGInfo will be called 5 times within our Task Sequence. Each bitmap represents the active “Phase” in an “On” position, and all other “Phases” in an “Off” position.
Creating Status Backgrounds
Since our deployment consists of 5 phases, we’ll need 5 different bitmaps. In addition to 5 different bitmaps, we actually need 5 BGInfo configuration files. BGInfo configuration files store rendering information used to display the background; these files are passed to BGInfo as parameters.
To create a screen, open BGInfo and:
- Choose a background image to use
- Choose what computer information to display
- Format/Justify/Center as preferred
Defining the background image to use, color, and positioning:
Defining what computer information is displayed, and where to position it:
Create all 5 pages in this manner, and save each BGInfo session. After completing these steps, the final list of files will look something like this:
Setting up the Task Sequence
Assuming all the required files exist in one directory, a method for calling the appropriate “Step” is necessary. This can be accomplished through a batch file containing the following:
- "%~dp0bginfo.exe" "%~dp0step_0%1.bgi" /nolicprompt /silent /timer:0
In this manner, your Task Sequence would simply reference the package and call the batch file with a Step number:
Maintaining Look & Feel
To maintain the look and feel across the entire deployment, there are three areas where adjusting the background image is important for consistency:
- Task Sequence Wallpaper set through BGInfo (already covered)
- Windows PE Wallpaper contained in the Boot Image
- Windows Setup Phase Wallpaper
When initially starting up in Windows PE, a default built-in background image is displayed. Until your Task Sequence begins and the background batch file runs, a user will see whatever background ships in Windows PE.
Apply your own background by opening up the SCCM console, locating your boot image, and modifying its properties. Look for the “Windows PE Background” field:
After applying and booting into it the new OS (after the “Setup Windows and ConfigMgr” step), an animated black background will appear for the duration of your Task Sequence. Windows Setup overlays a full-screen window named “FirstUXWnd” , displaying the text “Setup is preparing your computer for first use”. Until the Task Sequence has completed in its entirety, this window will be seen and the custom background will not.
Task Sequence background after booting into the new OS:
Assuming you’ve customized the first half of your Task Sequence to show a snazzy look/feel, you’ll probably want to persist this. Especially if your Task Sequence contains a large number of post-OS-install tasks, such as application installs.
One simple and safe workaround is to hide this window. Since we know the window title, we can simply search for it and send it a “hide window” message. However, this requires creating a small application to perform the hide.
Creating this application isn’t too difficult. An example of the API calls necessary to perform this is given below. Using either .NET or native C++, this is relatively simple to create.
- Enumerate all windows (EnumWindows)
- Search for the window titled “FirstUXWnd” (GetWindowText)
- Set the window state to “Hidden” (ShowWindow SW_HIDE | SW_SHOWNORMAL)
Once completed, run this binary from your Task Sequence immediately after the “Windows Setup and ConfigMgr” step.
Update! A complete source-code sample is available here.
You now completely control the deployment look and feel, end-to-end.