Yes, you can. However, because there is no volume license version of Windows Vista Ultimate, you would need to have a separate license key for each machine being deployed, and each of these machines would need to activate to the Microsoft activation servers on the Internet.
The simplest way of handling this is to use BDD 2007 Lite Touch and tell the wizard to prompt for a product key; the person performing the deployment would then need to make sure each key is used once and only once. And if Windows Vista Ultimate were ever reinstalled on the computer, you would want to use the exact same key the next time.
So while the manual approach is certainly doable, with a little creativity it is possible to do this using BDD 2007’s database capabilities to complete automate the whole process. The required pieces:
- A table to hold the product keys and to record which keys have been used by which computers.
- A stored procedure to claim a key for each machine, or to return an existing key if one was already claimed.
- Configuration entries in the BDD CustomSettings.ini file to call the stored procedure.
So first let’s look at the table. It’s pretty simple, as only two columns are needed: the product key, and the computer that has claimed it. If the key is unclaimed, the second column would be blank. So that leads to the next question: how to identify the computer. My preference is to use a unique value like the asset tag of the computer, although there are other options too (SMBIOS UUID, MAC address, serial number, etc.). So here’s the SQL statement to create the table:
CREATE TABLE [dbo].[ProductKeyMapping]
[ProductKey] [varchar](50) NOT NULL,
[AssetTag] [nvarchar](250) NULL
Then, we need a stored procedure that will first look for an already-claimed key and if one isn’t found, claims a new one. In either case it needs to return the assigned key back to the caller. Here’s the source for the stored procedure:
CREATE PROCEDURE [dbo].[GetProductKey]
DECLARE @foundCount int
SET NOCOUNT ON
/* Look for the existing row */
SELECT @foundCount = COUNT(*) FROM ProductKeyMapping WHERE AssetTag = @assetTag
IF @foundCount = 0
/* Not found, consume a key */
UPDATE TOP (1) ProductKeyMapping
SET AssetTag = @assetTag
WHERE AssetTag IS NULL
/* Now return the row */
SELECT ProductKey FROM ProductKeyMapping WHERE AssetTag = @assetTag
Then all you need to do is tell BDD to call the stored procedure. Assuming the database is on server SERVER1, uses the default instance, and is named BDD2007, the entries needed in CustomSettings.ini would look something like this:
So where’s the rest of the CustomSettings.ini? Well, this is only a sample; you would want to merge this into your (likely bigger) existing file. And what about the last line, specifying SQLShare=ZTI$? That is so that BDD can make a secure, integrated security connection to the database even from Windows PE: the BDD scripts will first map a driver to the specified server and share (e.g. \\SERVER1\ZTI$ from this example), then make a secure named pipe connection using the same credentials from that connection. (If you want to use TCP sockets instead of named pipes, you would need to specify a SQL ID and password to make the database connection, as Windows PE isn’t able to make an integrated security connection using TCP.)
This same process can be used for both Lite Touch and Zero Touch (SMS 2003) deployments. See, not that complicated 🙂