<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Michael Niehaus' Windows and Office deployment ramblings</title><link>http://blogs.technet.com/mniehaus/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>New Solution Accelerator Beta Available</title><link>http://blogs.technet.com/mniehaus/archive/2010/02/01/new-solution-accelerator-beta-available.aspx</link><pubDate>Mon, 01 Feb 2010 03:11:54 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3309667</guid><dc:creator>mniehaus</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3309667.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3309667</wfw:commentRss><description>&lt;p&gt;The beta version of the Configuration Manager Dashboard is now available on the Connect website.&amp;#160; You can gain access with this link:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://connect.microsoft.com/InvitationUse.aspx?ProgramID=4505&amp;amp;InvitationID= SCD-BGMB-FK9M&amp;amp;SiteID=14"&gt;https://connect.microsoft.com/InvitationUse.aspx?ProgramID=4505&amp;amp;InvitationID= SCD-BGMB-FK9M&amp;amp;SiteID=14&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So what is the Configuration Manager Dashboard?&amp;#160; Here’s the quick overview:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewSolutionAcceleratorBetaAvailable_13821/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewSolutionAcceleratorBetaAvailable_13821/image_thumb_2.png" width="492" height="370" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And a picture showing an example of what it can do (you can customize it to add your own charts too):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewSolutionAcceleratorBetaAvailable_13821/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewSolutionAcceleratorBetaAvailable_13821/image_thumb_1.png" width="492" height="492" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Want to present your ConfigMgr statistics and metrics using something prettier than just simple results?&amp;#160; Download it and try it out.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3309667" width="1" height="1"&gt;</description></item><item><title>Fixing Office Upcoming Appointments gadget to work with Office 2010</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/17/fixing-office-upcoming-appointments-gadget-to-work-with-office-2010.aspx</link><pubDate>Thu, 17 Dec 2009 07:36:50 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3301119</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3301119.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3301119</wfw:commentRss><description>&lt;p&gt;I just finished installing Office 2010 on all my home computers, and immediately ran into a “wife acceptance factor” issue: the “Outlook Upcoming Appointments” Sidebar gadget didn’t work:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/FixingOfficeUpcomingAppointmentsgadgetto_14C10/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/FixingOfficeUpcomingAppointmentsgadgetto_14C10/image_thumb.png" width="141" height="191" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;“Fix it.”&amp;#160; Sigh.&amp;#160; Fortunately, it wasn’t hard to do.&amp;#160; Locate the “C:\Users\&amp;lt;user ID&amp;gt;\AppData\Local\Microsoft\Windows Sidebar\Gadgets\OutlookAppointmentsGadget[1].gadget\en-US\js” folder and in it you’ll see a file called Outlook.vbs.&amp;#160; Open it in your favorite text editor and find the two lines that mention Outlook “12” and change them to reference Outlook “14” instead.&amp;#160; Change this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if value = &amp;quot;Outlook.Application.12&amp;quot; then &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if value = &amp;quot;Outlook.Application.14&amp;quot; then &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;and this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if mid(outlookApplication.Version, 1, 2) &amp;lt;&amp;gt; &amp;quot;12&amp;quot; then &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;to this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if mid(outlookApplication.Version, 1, 2) &amp;lt;&amp;gt; &amp;quot;14&amp;quot; then &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Save the changes, close the gadget, and open it again.&amp;#160; You should then see something that works:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/FixingOfficeUpcomingAppointmentsgadgetto_14C10/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/FixingOfficeUpcomingAppointmentsgadgetto_14C10/image_thumb_1.png" width="134" height="183" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If only all application compatibility issues were that simple…&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3301119" width="1" height="1"&gt;</description></item><item><title>Have questions about MDT 2010?</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/16/have-questions-about-mdt-2010.aspx</link><pubDate>Wed, 16 Dec 2009 20:20:38 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3301041</guid><dc:creator>mniehaus</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3301041.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3301041</wfw:commentRss><description>&lt;p&gt;We have created a new forum on TechNet specifically for MDT-related questions – no question is too simple or too advanced.&amp;#160; You can access the forum via &lt;a title="http://social.technet.microsoft.com/Forums/en-US/mdt/threads" href="http://social.technet.microsoft.com/Forums/en-US/mdt/threads"&gt;http://social.technet.microsoft.com/Forums/en-US/mdt/threads&lt;/a&gt;.&amp;#160; It’s been around for a couple of months, but we haven’t publicized it too heavily so we could slowly ramp up.&lt;/p&gt;  &lt;p&gt;As always, I seem to be keeping too busy to spent a lot of time responding to questions on the forum, but fortunately there are several other experts (including Tim Mintner, Keith Garner, and Johan Arwidmark) who have been helping out with that.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3301041" width="1" height="1"&gt;</description></item><item><title>Ready for Office 2010? It’s not far away.</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/08/ready-for-office-2010-it-s-not-far-away.aspx</link><pubDate>Tue, 08 Dec 2009 07:18:28 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3299070</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3299070.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3299070</wfw:commentRss><description>&lt;p&gt;The Office 2010 Beta has been available for a short while now and should be released sometime next year.&amp;#160; I’m already quite attached to it, and not only because of the &lt;a href="http://blogs.msdn.com/outlook/" target="_blank"&gt;“People Pane” in Outlook 2010&lt;/a&gt; and its coming ties to various social networks.&lt;/p&gt;  &lt;p&gt;To help with the coming migration, some new Office compatibility tools have been released.&amp;#160; See &lt;a title="http://blogs.technet.com/gray_knowlton/archive/2009/12/04/office-2010-application-compatibility-tools-beta-now-available.aspx" href="http://blogs.technet.com/gray_knowlton/archive/2009/12/04/office-2010-application-compatibility-tools-beta-now-available.aspx"&gt;http://blogs.technet.com/gray_knowlton/archive/2009/12/04/office-2010-application-compatibility-tools-beta-now-available.aspx&lt;/a&gt; for more details.&lt;/p&gt;  &lt;p&gt;Also, if you aren’t yet running the Key Management Service (KMS) or using Multiple Activation Keys (MAK) with Windows Vista or Windows 7, you’ll probably want to study up on Volume Activation, as &lt;a href="http://technet.microsoft.com/en-us/office/ee691939.aspx" target="_blank"&gt;Office 2010 will use it too&lt;/a&gt;.&amp;#160; There’s also a new beta version of the Volume Activation Management Tool (VAMT) 2.0 available for download &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8265fdef-b921-4dbf-ba8b-bb1cbe238ce6&amp;amp;displaylang=en" target="_blank"&gt;here&lt;/a&gt;.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;12/10/2009 Addendum:&amp;#160; There is another new download that might be useful at &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=600c2142-abc3-4fea-9271-0c326c45dc8f&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=600c2142-abc3-4fea-9271-0c326c45dc8f&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=600c2142-abc3-4fea-9271-0c326c45dc8f&amp;amp;displaylang=en&lt;/a&gt;.&amp;#160; It’s a poster that describes the deployment and installation options for Office 2010.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3299070" width="1" height="1"&gt;</description></item><item><title>RIS-style naming with MDT 2010: Use a web service</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/06/ris-style-naming-with-mdt-2010-use-a-web-service.aspx</link><pubDate>Sun, 06 Dec 2009 08:32:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3298679</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3298679.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3298679</wfw:commentRss><description>&lt;P&gt;I’ve been toying around with using a web service that could be used to implement RIS-style computer naming.&amp;nbsp; Unfortunately, I haven’t had time to work on it much in the last year or so, so I’ll post the code as-is and tell you up front that it’s not really complete – you might need to make some changes to it to meet your specific needs.&amp;nbsp; So here’s the code (written using Visual Studio 2008 and .NET 3.5), which shows how easy it is to do LDAP queries and object creation using .NET:&lt;/P&gt;&lt;PRE style="BORDER-BOTTOM: #cecece 1px solid; BORDER-LEFT: #cecece 1px solid; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #fbfbfb; MIN-HEIGHT: 40px; PADDING-LEFT: 5px; WIDTH: 755px; PADDING-RIGHT: 5px; HEIGHT: 2500px; OVERFLOW: auto; BORDER-TOP: #cecece 1px solid; BORDER-RIGHT: #cecece 1px solid; PADDING-TOP: 5px"&gt;&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Collections;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Collections.Generic;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.ComponentModel;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Diagnostics;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.DirectoryServices;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Data;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Linq;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web.Services;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web.Services.Protocols;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Xml.Linq;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; DemoWebService
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;{
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;    [WebService(Namespace = "&lt;SPAN style="COLOR: #8b0000"&gt;http://tempuri.org/&lt;/SPAN&gt;")]
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;    [ToolboxItem(&lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;)]
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; NameService : System.Web.Services.WebService
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;    {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;        [WebMethod]
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; String GenerateName(String dnsDomain, String prefix, String uuid, String machineObjectOU)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;        {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #008000"&gt;// Build the search&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            DirectoryEntry entry =
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; DirectoryEntry("&lt;SPAN style="COLOR: #8b0000"&gt;LDAP://&lt;/SPAN&gt;" + dnsDomain);
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            DirectorySearcher search = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; DirectorySearcher(entry,
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;               "&lt;SPAN style="COLOR: #8b0000"&gt;(name=&lt;/SPAN&gt;" + prefix + "&lt;SPAN style="COLOR: #8b0000"&gt;*)&lt;/SPAN&gt;");
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #008000"&gt;// Execute the search and build a list of the matching names and their UUIDs&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            Dictionary&amp;lt;String, Guid&amp;gt; existingNames = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; Dictionary&amp;lt;String, Guid&amp;gt;();
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (SearchResult result &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; search.FindAll())
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                String name = result.Properties["&lt;SPAN style="COLOR: #8b0000"&gt;name&lt;/SPAN&gt;"][0].ToString().ToUpper();
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                Guid netbootGuid = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; Guid();
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (result.Properties["&lt;SPAN style="COLOR: #8b0000"&gt;netbootGuid&lt;/SPAN&gt;"].Count &amp;gt; 0)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                    netbootGuid = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; Guid((&lt;SPAN style="COLOR: #0000ff"&gt;byte&lt;/SPAN&gt;[])result.Properties["&lt;SPAN style="COLOR: #8b0000"&gt;netbootGuid&lt;/SPAN&gt;"][0]);
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                Trace.WriteLine("&lt;SPAN style="COLOR: #8b0000"&gt;Found computer &lt;/SPAN&gt;" + name + "&lt;SPAN style="COLOR: #8b0000"&gt; with GUID &lt;/SPAN&gt;" + netbootGuid.ToString());
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                existingNames.Add(name, netbootGuid);
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #008000"&gt;// See if we can find an existing match.  If so, return it.&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            Guid existingUuid = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; Guid(uuid);
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (existingNames.ContainsValue(existingUuid))
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (String name &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; existingNames.Keys)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                    &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (existingNames[name] == existingUuid)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                    {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                        &lt;SPAN style="COLOR: #008000"&gt;// TODO: Maybe we want to move the computer object to the specified OU&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                        &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; name;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                    }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #008000"&gt;// Find the first available name in sequence&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            String nextName = &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;for&lt;/SPAN&gt; (Int32 i = 1; i &amp;lt;= 999; i++)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                String testName = prefix + i.ToString("&lt;SPAN style="COLOR: #8b0000"&gt;000&lt;/SPAN&gt;");
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (!existingNames.ContainsKey(testName))
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                    nextName = testName;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (nextName == &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;;  &lt;SPAN style="COLOR: #008000"&gt;// All names were taken&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #008000"&gt;// Add the computer to AD&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                DirectoryEntry dirEntry = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; DirectoryEntry("&lt;SPAN style="COLOR: #8b0000"&gt;LDAP://&lt;/SPAN&gt;" + machineObjectOU);
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                DirectoryEntry newUser = dirEntry.Children.Add("&lt;SPAN style="COLOR: #8b0000"&gt;CN=&lt;/SPAN&gt;" + nextName, "&lt;SPAN style="COLOR: #8b0000"&gt;computer&lt;/SPAN&gt;");
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                newUser.Properties["&lt;SPAN style="COLOR: #8b0000"&gt;samAccountName&lt;/SPAN&gt;"].Value = nextName + "&lt;SPAN style="COLOR: #8b0000"&gt;$&lt;/SPAN&gt;";
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                newUser.Properties["&lt;SPAN style="COLOR: #8b0000"&gt;netbootGUID&lt;/SPAN&gt;"].Value = existingUuid.ToByteArray();
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                newUser.Properties["&lt;SPAN style="COLOR: #8b0000"&gt;description&lt;/SPAN&gt;"].Value = "&lt;SPAN style="COLOR: #8b0000"&gt;Added by MDT&lt;/SPAN&gt;";
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                newUser.CommitChanges();
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                newUser.Close();
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;catch&lt;/SPAN&gt; (Exception e)
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            {
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;                Trace.WriteLine("&lt;SPAN style="COLOR: #8b0000"&gt;Unable to add computer: &lt;/SPAN&gt;" + e.ToString());
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #008000"&gt;// Return the name&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; nextName;
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;        }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;    }
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;}
&lt;/PRE&gt;
&lt;PRE style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;&lt;/PRE&gt;&lt;/PRE&gt;
&lt;P&gt;To use this, you would add an entry to CustomSettings.ini to call the web service.&amp;nbsp; That would look something like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[Settings] &lt;BR&gt;Priority=Default, GetName &lt;BR&gt;Properties=DnsDomain, Prefix &lt;/P&gt;
&lt;P&gt;[Default] &lt;BR&gt;Prefix=MDTTEST &lt;BR&gt;DnsDomain=mydomain.com &lt;BR&gt;MachineObjectOU=OU=Workstations,DC=mydomain,DC=com &lt;/P&gt;
&lt;P&gt;[GetName] &lt;BR&gt;WebService=&lt;A href="http://myserver/NameService.asmx/GenerateName" mce_href="http://myserver/NameService.asmx/GenerateName"&gt;http://myserver/NameService.asmx/GenerateName&lt;/A&gt; &lt;BR&gt;Parameters=DnsDomain, Prefix, UUID, MachineObjectOU &lt;BR&gt;OSDComputerName=string&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The web service would be passed the DNS domain name (mydomain.com), computer prefix (MDTTEST), the current machine’s SMBIOS UUID, and the OU to which new computers should be added.&amp;nbsp; It will return a name starting with the specified prefix and ending with the next available three-digit number.&amp;nbsp; So the first machine would be MDTTEST001, the second MDTTEST002, etc.&amp;nbsp; These computer names are added to Active Directory with the “netbootGUID” attribute set, so that if the machine is ever rebuilt it will use the same computer name again.&amp;nbsp; (The code purposely doesn’t try to find any computer object with that SMBIOS UUID.&amp;nbsp; Instead, it only looks for computers with the right prefix that have a matching UUID.&amp;nbsp; This might not be the behavior you want, but it was the behavior I wanted.)&lt;/P&gt;
&lt;P&gt;The output from ZTIGather.wsf when processing this INI file would look something like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Added new custom property DNSDOMAIN &lt;BR&gt;Added new custom property PREFIX &lt;BR&gt;Using from [Settings]: Rule Priority = DEFAULT, GETNAME &lt;BR&gt;------ Processing the [DEFAULT] section ------ &lt;BR&gt;Property MACHINEOBJECTOU is now = OU=Workstations,DC=mydomain,DC=com &lt;BR&gt;Using from [DEFAULT]: MACHINEOBJECTOU = OU=Workstations,DC=mydomain,DC=com &lt;BR&gt;Property DNSDOMAIN is now = mydomain.com &lt;BR&gt;Using from [DEFAULT]: DNSDOMAIN = mydomain.com &lt;BR&gt;Property PREFIX is now = MDTTEST &lt;BR&gt;Using from [DEFAULT]: PREFIX = MDTTEST &lt;BR&gt;------ Processing the [GETNAME] section ------ &lt;BR&gt;Determining the INI file to use. &lt;BR&gt;Using COMMAND LINE ARG: Ini file = CS.ini &lt;BR&gt;Finished determining the INI file to use. &lt;BR&gt;Using COMMAND LINE ARG: Ini file = CS.ini &lt;BR&gt;CHECKING the [GETNAME] section &lt;BR&gt;About to execute web service call using method POST to &lt;A href="http://server/NameService.asmx/GenerateName" mce_href="http://server/NameService.asmx/GenerateName"&gt;http://server/NameService.asmx/GenerateName&lt;/A&gt;: DnsDomain=mydomain.com&amp;amp;Prefix=MDTTEST&amp;amp;UUID=814100CD-CE48-CB11-A536-B7561D1E4450&amp;amp;MachineObjectOU=OU=Workstations,DC=mydomain,DC=com &lt;BR&gt;Response from web service: 200 OK &lt;BR&gt;Successfully executed the web service. &lt;BR&gt;Property OSDCOMPUTERNAME is now = MDTTEST001 &lt;BR&gt;Obtained OSDCOMPUTERNAME value from web service:&amp;nbsp; string = MDTTEST001&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This isn’t quite as flexible as the RIS naming, where you could use other variables in the computer name, but there’s no reason you couldn’t add more logic to cover those cases too.&amp;nbsp; There’s also no guarantee that the web service will add the computer account to the same DC that the computer ends up using, which could cause some naming conflicts if the new computer object doesn’t replicate before the computer tries to join the domain.&amp;nbsp; Use at your own risk :-)&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3298679" width="1" height="1"&gt;</description></item><item><title>Workaround posted for ConfigMgr SP2 issue with USMT 4.0</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/01/workaround-posted-for-configmgr-sp2-issue-with-usmt-4-0.aspx</link><pubDate>Tue, 01 Dec 2009 21:42:07 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3297669</guid><dc:creator>mniehaus</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3297669.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3297669</wfw:commentRss><description>&lt;p&gt;Levi Stevens posted a blog entry today describing a workaround for an issue with ConfigMgr SP2 and USMT 4.0 that causes USMT to not capture all of the user state information.&amp;#160; See &lt;a title="http://blogs.technet.com/configmgrteam/archive/2009/12/01/known-issue-migrating-from-windows-xp-to-windows-7-with-usmt-when-used-with-configmgr-2007-sp2-os-deployment-may-not-migrate-all-settings.aspx" href="http://blogs.technet.com/configmgrteam/archive/2009/12/01/known-issue-migrating-from-windows-xp-to-windows-7-with-usmt-when-used-with-configmgr-2007-sp2-os-deployment-may-not-migrate-all-settings.aspx"&gt;http://blogs.technet.com/configmgrteam/archive/2009/12/01/known-issue-migrating-from-windows-xp-to-windows-7-with-usmt-when-used-with-configmgr-2007-sp2-os-deployment-may-not-migrate-all-settings.aspx&lt;/a&gt; for all the details.&lt;/p&gt;  &lt;p&gt;We are still working on a KB article for MDT 2010 that provides a similar fix.&amp;#160; That KB article (which will be 977565 once it is finally available) will describe the changes necessary to ZTIUserState.wsf.&amp;#160; (They are pretty minor, just adding two lines to set the working directory to the folder containing the USMT binaries before running scanstate.exe or loadstate.exe.)&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3297669" width="1" height="1"&gt;</description></item><item><title>Dynamic application detection with Lite Touch, Revisited</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/01/dynamic-application-detection-with-lite-touch-revisited.aspx</link><pubDate>Tue, 01 Dec 2009 08:18:20 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3297439</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3297439.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3297439</wfw:commentRss><description>&lt;p&gt;Over a year ago, I posted a blog entry at &lt;a title="http://blogs.technet.com/mniehaus/archive/2008/09/25/dynamic-application-detection-with-lite-touch.aspx" href="http://blogs.technet.com/mniehaus/archive/2008/09/25/dynamic-application-detection-with-lite-touch.aspx" target="_blank"&gt;http://blogs.technet.com/mniehaus/archive/2008/09/25/dynamic-application-detection-with-lite-touch.aspx&lt;/a&gt; with details on how to automatically detect installed applications during a Lite Touch deployment, enabling those to be pre-selected when the application list is presented.&amp;#160; Due to changes in the XML file schemas, this script needs some updates for MDT 2010 to be truly “correct”.&amp;#160; The updated script follows, showing how to create a user exit that leverages the ZTIConfigFile script to enumerate all the available (enabled, visible) applications.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Option Explicit &lt;/p&gt;    &lt;p&gt;Function UserExit(sType, sWhen, sDetail, bSkip) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Dim oScriptFile     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim oXMLApps, dAllApps      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim sGUID      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim oNode, oKey      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim sValueName, sKey, sValue      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim oApplications &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ' Only do this before processing the rule contents &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; If sWhen &amp;lt;&amp;gt; &amp;quot;BEFORE&amp;quot; then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UserExit = Success      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Exit Function      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End if &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ' Make sure ZTIConfigFile is loaded &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Set oScriptFile = oFSO.OpenTextFile(oUtility.ScriptDir &amp;amp; &amp;quot;\ZTIConfigFile.vbs&amp;quot;, 1, false)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ExecuteGlobal oScriptFile.ReadAll      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ' Load the applications XML File &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Set oXMLApps = new ConfigFile     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; oXMLApps.sFileType = &amp;quot;Applications&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Set dAllApps = oXMLApps.FindItems &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ' Enumerate the applications &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; For each sGUID in dAllApps &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set oNode = dAllApps(sGUID) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Retrieve the uninstall key node if present &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set oKey = oNode.selectSingleNode(&amp;quot;UninstallKey&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If one was specified, look for the key in the registry &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If not (oKey is nothing) then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the key name &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sKey = oKey.Text &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Check if the registry key exists by looking for well-known values &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For each sValueName in Array(&amp;quot;DisplayName&amp;quot;, &amp;quot;UninstallString&amp;quot;, &amp;quot;QuietUninstallString&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sValue = empty     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sValue = oShell.RegRead(&amp;quot;HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\&amp;quot; &amp;amp; sKey &amp;amp; &amp;quot;\&amp;quot; &amp;amp; sValueName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If IsEmpty(sValue) then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sValue = oShell.RegRead(&amp;quot;HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\&amp;quot; &amp;amp; sKey &amp;amp; &amp;quot;\&amp;quot; &amp;amp; sValueName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End if &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If a value was found, add the application's GUID to the list so it gets pre-selected by the wizard &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If not IsEmpty(sValue) then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; oLogging.CreateEntry &amp;quot;Uninstall registry key found for application &amp;quot; &amp;amp; oNode.selectSingleNode(&amp;quot;Name&amp;quot;).Text &amp;amp; &amp;quot;, application is present and will be reinstalled.&amp;quot;, LogTypeInfo &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Add the GUID if it doesn't already exist in the list &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set oApplications = oEnvironment.ListItem(&amp;quot;Applications&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If not oApplications.Exists(oNode.Attributes.getNamedItem(&amp;quot;guid&amp;quot;).value) then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; oApplications.Add oNode.Attributes.getNamedItem(&amp;quot;guid&amp;quot;).value, &amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; oEnvironment.ListItem(&amp;quot;Applications&amp;quot;) = oApplications      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End if &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Exit For &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End if &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; oLogging.CreateEntry &amp;quot;UninstallKey not specified for application &amp;quot; &amp;amp; oNode.selectSingleNode(&amp;quot;Name&amp;quot;).Text, LogTypeInfo &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End if &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Next &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; UserExit = Success &lt;/p&gt;    &lt;p&gt;End Function&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The code has been updated some, but the concepts haven’t, so if you need more details on what this does check out the &lt;a href="http://blogs.technet.com/mniehaus/archive/2008/09/25/dynamic-application-detection-with-lite-touch.aspx" target="_blank"&gt;original article&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3297439" width="1" height="1"&gt;</description></item><item><title>In the Seattle area?  Come to the Windows Networking User’s Group meeting</title><link>http://blogs.technet.com/mniehaus/archive/2009/12/01/in-the-seattle-area-come-to-the-windows-networking-user-s-group-meeting.aspx</link><pubDate>Tue, 01 Dec 2009 03:53:17 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3297411</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3297411.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3297411</wfw:commentRss><description>&lt;p&gt;On Wednesday, December 2, the Windows Networking User’s Group is having their monthly meeting at the Microsoft office in Bellevue.&amp;#160; Chris Avis is the featured speaker this month, and the topic of his presentation is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Windows 7 New Features: Windows XP Mode &amp;amp; Boot to VHD&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Windows 7 introduces host of new features and technologies to simplify your work and make you more productive. Two technologies you may not have heard about are Windows XP Mode and the new “Boot to VHD” feature.&amp;#160; &lt;/p&gt;    &lt;p&gt;Windows XP Mode allows administrators to migrate legacy applications from that Windows XP world into Windows 7 regardless of that applications compatibility with Windows 7. Windows XP Mode provides a virtualized instance of Windows XP that allows you to continue to run older applications while still enjoying the benefits of Windows 7. The best part of this deal is that it is FREE!&lt;/p&gt;    &lt;p&gt;The Boot to VHD feature of Windows 7 allows you to boot a virtualized operating system “natively”. This provides for better resource utilization, access to some hardware components that normally can’t be used in a virtual machine, as well as eliminating boot code issues surrounding dual or multi-boot scenarios. Chris will discuss how to configure and run Boot to VHD features as well as some new options in Windows 7 that make creating and supporting this feature a breeze.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Pizza and soft drinks will be served at 6pm, with the presentation scheduled for 6:30pm.&amp;#160; If you are in the area and would like to attend, please &lt;a href="http://www.winnetusergroup.com/Lists/RSVP/NewForm.aspx?Source=http://www.winnetusergroup.com/Shared%20Resources/ThankYouRSVP.aspx?PageView=Shared&amp;amp;ContentEditorPopUp=True"&gt;RSVP&lt;/a&gt;.&amp;#160; For more details, visit the WNUG site at &lt;a title="http://www.winnetusergroup.com/default.aspx" href="http://www.winnetusergroup.com/default.aspx"&gt;http://www.winnetusergroup.com/default.aspx&lt;/a&gt;.&amp;#160; (I hope to attend myself.)&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3297411" width="1" height="1"&gt;</description></item><item><title>Two webcasts next week</title><link>http://blogs.technet.com/mniehaus/archive/2009/11/28/two-webcasts-next-week.aspx</link><pubDate>Sat, 28 Nov 2009 23:43:33 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3296821</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3296821.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3296821</wfw:commentRss><description>&lt;p&gt;I’ll be busy next week, with two different webcasts targeting different groups of people.&amp;#160; If you’re part of either group, please attend as I don’t want to be presenting to “virtual crickets”.&lt;/p&gt;  &lt;p&gt;The first webcast targets Gold Certified, Certified, and Empower partners (you’ll need to be in one of those categories to register via the partner portal) as part of a “Technical Advisory Services Advisory Hour”.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;Join the “&lt;/b&gt;&lt;b&gt;Adding value to Microsoft Deployment Toolkit 2010: Extending Windows 7 Deployment” Seminar!&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;Microsoft Partners, find out how MDT 2010 simplifies the process of deploying Windows 7, while also providing many opportunities for customization.&amp;#160; Explore ways that you can extend MDT 2010, adding value to your customer’s Windows 7 deployment projects. Join this Web Seminar on December 1&lt;sup&gt;st&lt;/sup&gt; from 10am-11am PST to learn how to simplify the process of deploying Windows 7.&lt;/p&gt;    &lt;p&gt;Next Steps:&lt;/p&gt;    &lt;p&gt;· &lt;a href="https://training.partner.microsoft.com/learning/app/management/LMS_ActDetails.aspx?UserMode=0&amp;amp;ActivityId=558506"&gt;Sign up for the Web Seminar: &lt;b&gt;Adding value to Microsoft Deployment Toolkit 2010: Extending Windows 7 Deployment&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;· &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=3bd8561f-77ac-4400-a0c1-fe871c461a89&amp;amp;displaylang=en&amp;amp;tm"&gt;Download MDT 2010&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;· &lt;a href="http://technet.microsoft.com/en-us/library/ee376932.aspx?SA_CE=WIN7-MDT-Partner-Seminar-2009-12-01"&gt;Learn more&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The second webcast is part of the “Fireside Chat” series described by Graham Watson at &lt;a title="http://blogs.technet.com/grahamtwatson/archive/2009/11/28/fire-side-chats.aspx" href="http://blogs.technet.com/grahamtwatson/archive/2009/11/28/fire-side-chats.aspx"&gt;http://blogs.technet.com/grahamtwatson/archive/2009/11/28/fire-side-chats.aspx&lt;/a&gt;.&amp;#160; These target user’s group leaders, MVPs, and other “influentials”, with about 15 minutes reserved for presentations and the rest of the time spent answering questions from the audience.&amp;#160; You can register at &lt;a title="http://ug.gitca.org/sites/FireSideChats/default.aspx" href="http://ug.gitca.org/sites/FireSideChats/default.aspx"&gt;http://ug.gitca.org/sites/FireSideChats/default.aspx&lt;/a&gt; for either time (both are Pacific timezone, GMT-08:00).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://ug.gitca.org/sites/FireSideChats/Lists/Fire%20Side%20Chats/DispForm.aspx?ID=8"&gt;Microsoft Deployment Toolkit 2010 - Solution Accelerator&amp;#160; &lt;/a&gt;&lt;/p&gt;    &lt;p&gt;12/3/2009 9:00 AM &lt;/p&gt;    &lt;p&gt;12/3/2009 4:00 PM &lt;/p&gt;    &lt;p&gt;Moving to Windows7? Learn how Microsoft Deployment Toolkit 2010 can make your job easier.&amp;#160; &lt;br /&gt;This Solution Accelerator is the recommended process and toolset for automating desktop and server deployment.&amp;#160; &lt;br /&gt;Learn more about&amp;#160; installation, image creation, and deployment scenarios for using MDT. Senior Software Development Engineer Michael Niehaus will be leading this session and he’ll answer any questions you may have.      &lt;br /&gt;Michael is the lead developer for the Microsoft Deployment Toolkit. Prior to joining Microsoft in 2004, Michael spent his entire career in enterprise IT, focused on deploying and managing Microsoft software.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3296821" width="1" height="1"&gt;</description></item><item><title>MDT 2010 Wizard Example: Role Selection</title><link>http://blogs.technet.com/mniehaus/archive/2009/10/28/mdt-2010-wizard-example-role-selection.aspx</link><pubDate>Wed, 28 Oct 2009 04:12:23 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3289703</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3289703.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3289703</wfw:commentRss><description>&lt;p&gt;We have seen lots of requests over the past couple of years for a wizard pane that allows you to select from a list of roles that should be applied to a machine, where those roles are defined in the MDT database.&amp;#160; There are a few examples of this available on the web, implemented in different ways.&amp;#160; I’ll throw another one into the mix, this one using an ADO.NET Data Services web service to get the needed data.&amp;#160; (If you didn’t read my previous posting about this setup, &lt;a href="http://blogs.technet.com/mniehaus/archive/2009/10/27/using-the-mdt-database-from-a-web-service-without-writing-code.aspx" target="_blank"&gt;click here&lt;/a&gt;.)&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Wizard&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Global&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CustomStatement&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;![CDATA[
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' ***************************************************************************
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' File:	Roles.xml
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' Author:	Michael Niehaus
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' Version:	1.0
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' Purpose:	Display a list of roles from the MDT database, retrieved
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	using an ADO.NET Data Services.web service.  One
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	or more roles can be selected.  After they have been
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	chosen, CustomSettings.ini needs to be re-processed
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	to pick up the new settings.  Ideally this would be done
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	after the wizard is complete (just in case someone 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	navigated back to the screen after initially making
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'	changes), but that requires changing LiteTouch.wsf.
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' NOTE:	Be sure to modify the web service URL below
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;'
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;' ***************************************************************************
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Function InitializeRoleList
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Dim sScript
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Dim oDataService
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Dim oRole
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Dim sRoles
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' Make sure that ZTIDataAccess.vbs is available since it isn't loaded by Wizard.hta
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	sScript = oFSO.OpenTextFile(oUtility.ScriptDir &amp;amp; &amp;quot;\ZTIDataAccess.vbs&amp;quot;, 1, false).ReadAll
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	On Error Resume Next
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	ExecuteGlobal sScript
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	On Error Goto 0
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' Call the web service
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Set oDataService = New WebService
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	oDataService.WebService = &amp;quot;http://localhost:62932/MDTDatabase.svc/RoleIdentity&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	oDataService.Method = &amp;quot;REST&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Set oResult = oDataService.Query
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' Process the roles to populate the list of checkboxes
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	sRoles = &amp;quot;&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	For each oRole in oResult.SelectNodes(&amp;quot;//d:Role&amp;quot;)
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		sRoles = sRoles &amp;amp; &amp;quot;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;checkbox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;Roles&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;Roles&lt;/span&gt; &lt;span style="color: #ff0000"&gt;enabled&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'&amp;quot; &amp;amp; oRole.Text &amp;amp; &amp;quot;'&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;quot; &amp;amp; oRole.Text &amp;amp; &amp;quot;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	Next
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' If no roles were found, set the div to indicate that
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	If sRoles = &amp;quot;&amp;quot; then
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		sRoles = &amp;quot;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;errmsg&lt;/span&gt; &lt;span style="color: #ff0000"&gt;style&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'display: inline;'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;No roles could be found.&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	End if
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' Update the pane
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	RoleList.InnerHTML = sRoles
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;End Function
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Function ValidateRoleList
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' Flush the value to variables.dat, before we continue.
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	SaveAllDataElements
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	SaveProperties
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	' Process full rules (needed to pick up the role settings, apps, etc.)
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	sCmd = &amp;quot;wscript.exe &amp;quot;&amp;quot;&amp;quot; &amp;amp; oUtility.ScriptDir &amp;amp; &amp;quot;\ZTIGather.wsf&amp;quot;&amp;quot;&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	oItem = oShell.Run(sCmd, , true)
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	ValidateRoleList = True
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;End Function
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;]]&amp;gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CustomStatement&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Global&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Pane&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Roles&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;![CDATA[&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;H1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Select the roles to be assigned to this computer.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;H1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;TreeList&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;RoleList&lt;/span&gt; &lt;span style="color: #ff0000"&gt;style&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;height: expression( GetDynamicListBoxSize(this) );&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;errmsg&lt;/span&gt; &lt;span style="color: #ff0000"&gt;style&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;display: inline;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Loading roles...
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;&amp;lt;!-- List goes here --&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;]]&amp;gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Validation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;![CDATA[ValidateRoleList]]&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Validation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Initialization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;![CDATA[setTimeout GetRef(&amp;quot;InitializeRoleList&amp;quot;), 0]]&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Initialization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Pane&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Wizard&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;While this is set up as a stand-alone wizard, you can insert this into an existing deployment wizard using the &lt;a href="http://mdtwizardeditor.codeplex.com/" target="_blank"&gt;MDT Wizard Editor&lt;/a&gt; by following these steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Launch the MDT Wizard Editor. &lt;/li&gt;

  &lt;li&gt;Open the DeployWiz_Definition_ENU.xml file. &lt;/li&gt;

  &lt;li&gt;Click on the “Global” pane.&amp;#160; Click “Add” on the “Settings” pane and choose to add a new “CustomStatement”. &lt;/li&gt;

  &lt;li&gt;Select the new “CustomStatement” at the end of the “Settings” list. &lt;/li&gt;

  &lt;li&gt;Select the VBScript code above (from the first comment line to the last End Function line) and copy it to the clipboard. &lt;/li&gt;

  &lt;li&gt;Paste the copied VBScript code into the text box in the MDT Wizard Editor.&amp;#160; Edit the web service URL to specify your ADO.NET Data Services web service URL. &lt;/li&gt;

  &lt;li&gt;Select a wizard pane (the new pane will be inserted after this one, so select appropriately). &lt;/li&gt;

  &lt;li&gt;Select all the text above from “&amp;lt;Pane” through “&amp;lt;/Pane&amp;gt;” and copy it to the clipboard. &lt;/li&gt;

  &lt;li&gt;Right-click on the selected pane name in the MDT Wizard Editor and choose “Paste”. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What, your MDT Wizard Editor doesn’t have a “Paste” option?&amp;#160; Well, you need to download a new version from &lt;a title="http://mdtwizardeditor.codeplex.com/" href="http://mdtwizardeditor.codeplex.com/"&gt;http://mdtwizardeditor.codeplex.com/&lt;/a&gt;, as I just added the paste capability tonight (along with other general usability improvements – I forced myself to actually use the program to create the rules wizard pane above and fixed all the behaviors I didn’t like while I was at it).&lt;/p&gt;

&lt;p&gt;A few notes to mention:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Because the wizard runs after CustomSettings.ini has been processed, the role settings, applications, etc. wouldn’t be processed as the “Gather” process isn’t run again.&amp;#160; To work around this, I added logic above to run ZTIGather.wsf again.&amp;#160; This could add a delay when clicking “Next”, so you might choose to do this later (possibly by modifying LiteTouch.wsf).&amp;#160; The other problem with running ZTIGather.wsf from this wizard pane:&amp;#160; If you navigate back to this wizard pane and uncheck an item, it’s too late – the settings for that role have already been added into the task sequence environment.&lt;/li&gt;

  &lt;li&gt;The MDT 2010 wizard hypertext application (Wizard.hta) doesn’t load the ZTIDataAccess.vbs script needed to make web service calls from a wizard pane.&amp;#160; To work around this, I added logic above to dynamically load the file.&amp;#160; The other alternative would be to edit Wizard.hta to tell it to include the file.&lt;/li&gt;

  &lt;li&gt;The role list is populated asynchronously so that the wizard doesn’t appear to be hung.&amp;#160; This is done by the “setTimeout” initialization statement above.&amp;#160; Note that the “Next” (or “Finish”) button will be enabled even while this is happening, so if you don’t want to wait you can probably go ahead and click the button to move on to the next pane.&lt;/li&gt;

  &lt;li&gt;If you don’t have the ADO.NET Data Services web service set up and working, don’t expect this wizard pane to somehow magically fix it :-)&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3289703" width="1" height="1"&gt;</description></item><item><title>Using the MDT database from a web service without writing code</title><link>http://blogs.technet.com/mniehaus/archive/2009/10/27/using-the-mdt-database-from-a-web-service-without-writing-code.aspx</link><pubDate>Tue, 27 Oct 2009 19:12:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3289615</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3289615.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3289615</wfw:commentRss><description>&lt;P&gt;One of the new features in the .NET Framework 3.5 SP1 is ADO.NET Data Services.&amp;nbsp; This enables you to expose the contents of a data source, e.g. a SQL Server database, through something that looks roughly like an RSS feed, accessed in a similar manner to a web service.&amp;nbsp; That’s nice but why do you care as an IT pro?&amp;nbsp; Well, it’s a convenient way of making the contents of the MDT database available to programs or scripts without forcing them to use ADO to access SQL Server directly.&lt;/P&gt;
&lt;P&gt;The best part of ADO.NET Data Services:&amp;nbsp; You really don’t need to write any code.&amp;nbsp; Just walk through a few Visual Studio 2008 wizards and you’re done – almost.&amp;nbsp; There are two lines of code that I added, one to day that all the selected tables and rows can be accessed read-only, and a second that generates detailed errors if something doesn’t work.&amp;nbsp; The basic process is described at &lt;A title=http://msdn.microsoft.com/en-us/data/cc745957.aspx href="http://msdn.microsoft.com/en-us/data/cc745957.aspx" mce_href="http://msdn.microsoft.com/en-us/data/cc745957.aspx"&gt;http://msdn.microsoft.com/en-us/data/cc745957.aspx&lt;/A&gt;.&amp;nbsp; (So I lied – you have to write two lines of code.)&lt;/P&gt;
&lt;P&gt;The harder part of this is deploying the resulting ADO.NET Data Services project to an IIS server.&amp;nbsp; You need to have .NET 3.5 SP1 installed, then IIS and ASP.NET need to be installed.&amp;nbsp; You might need to run “ServiceModelReg.exe –i” to get the ADO.NET Data Services and WCF logic registered in IIS, see &lt;A title=http://msdn.microsoft.com/en-us/library/ms732012.aspx href="http://msdn.microsoft.com/en-us/library/ms732012.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms732012.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms732012.aspx&lt;/A&gt; for details.&amp;nbsp; You will definitely need to edit the database connection string in the Web.Config file to point to your server (and optionally the instance) as well as the database (Initial Catalog) that needs to be used.&amp;nbsp; And you might need to grant access to SQL Server, the database, and the database tables and views.&amp;nbsp; (See &lt;A title=http://msdn.microsoft.com/en-us/library/ms998320.aspx href="http://msdn.microsoft.com/en-us/library/ms998320.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms998320.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms998320.aspx&lt;/A&gt; if SQL Server is on the same machine.)&amp;nbsp; Really, it’s not that bad :-)&lt;/P&gt;
&lt;P&gt;The actual ADO.NET Data Services files need to all be dropped in a directory.&amp;nbsp; After doing this, set up an application in IIS that points to this directory.&amp;nbsp; At that point, if everything is set up right, you should be able to access the the web service via a browser.&amp;nbsp; To test it out, try a URL like this:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://yourserver/YourApplicationName/MDTDatabase.svc" mce_href="http://yourserver/YourApplicationName/MDTDatabase.svc"&gt;http://yourserver/YourApplicationName/MDTDatabase.svc&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;If that gives you a list of objects available in the database (you might need to tell IE not to display the result in RSS Reader view to see the real contents – in IE8, that’s configured on the “Content” tab from the “Feeds and Slices” settings dialog), you know at least IIS, .NET, and ADO.NET are fine.&amp;nbsp; Then try a more specific URL to request all the computer records:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://yourserver/YourApplicationName/MDTDatabase.svc/ComputerIdentity" mce_href="http://yourserver/YourApplicationName/MDTDatabase.svc/ComputerIdentity"&gt;http://yourserver/YourApplicationName/MDTDatabase.svc/ComputerIdentity&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;That should result in something that looks like this:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/UsingtheMDTdatabasefromawebservicewithou_16B0/image_4.png" mce_href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/UsingtheMDTdatabasefromawebservicewithou_16B0/image_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/UsingtheMDTdatabasefromawebservicewithou_16B0/image_thumb_1.png" width=717 height=209 mce_src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/UsingtheMDTdatabasefromawebservicewithou_16B0/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Yes, kind of weird looking, but pretty easy to consume in a script.&amp;nbsp; So that’s the next step – making use of this data.&amp;nbsp; More on that in the next posting.&lt;/P&gt;
&lt;P&gt;The full solution (Visual Studio project, source, binaries, etc.) is attached.&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3289615" width="1" height="1"&gt;</description><enclosure url="http://blogs.technet.com/mniehaus/attachment/3289615.ashx" length="689280" type="application/x-zip-compressed" /></item><item><title>New version of the MDT Wizard Editor is available</title><link>http://blogs.technet.com/mniehaus/archive/2009/10/12/new-version-of-the-mdt-wizard-editor-is-available.aspx</link><pubDate>Mon, 12 Oct 2009 22:22:14 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3286298</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3286298.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3286298</wfw:commentRss><description>&lt;p&gt;For those of you who customize the MDT wizards, you may want to check out the new version of the MDT Wizard Editor at &lt;a title="http://mdtwizardeditor.codeplex.com" href="http://mdtwizardeditor.codeplex.com"&gt;http://mdtwizardeditor.codeplex.com&lt;/a&gt;.&amp;#160; The latest version 2.0, uploaded today, includes a few fixes (e.g. properly encoding XML file entries in CDATA sections), adds support for MDT 2010, and includes a few new features.&lt;/p&gt;  &lt;p&gt;The first change you will notice is that there is now a menu bar:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewversionoftheMDTWizardEditorisavailabl_D824/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewversionoftheMDTWizardEditorisavailabl_D824/image_thumb.png" width="476" height="348" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Use the “File” menu to open menu definition files (XML files), save your changes, and to exit the program.&amp;#160; Use the “Wizard” menu to test a wizard definition file after you have made changes.&lt;/p&gt;  &lt;p&gt;The testing process is the most significant change in this new version.&amp;#160; It will gather information from the machine (running ZTIGather, as long as it can find it) and then display all of the variable values before starting the wizard:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewversionoftheMDTWizardEditorisavailabl_D824/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewversionoftheMDTWizardEditorisavailabl_D824/image_thumb_1.png" width="429" height="319" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can modify variables, remove variables, add variables – whatever you would like to do.&amp;#160; When you are ready to run the wizard, click the “Run” button.&amp;#160; Once you have completed the wizard, the dialog will be updated to show you the variables that were set after the wizard completed:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewversionoftheMDTWizardEditorisavailabl_D824/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/NewversionoftheMDTWizardEditorisavailabl_D824/image_thumb_2.png" width="433" height="322" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In this case, you can see the additional variables that were defined for keyboards, applications, BitLocker, etc.&lt;/p&gt;  &lt;p&gt;If you find any issues with this release, or if you have any suggestions on how to improve the release (subject to my available time), please use the CodePlex “Issue Tracker” to submit new items.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3286298" width="1" height="1"&gt;</description></item><item><title>MDT 2010 New Feature #21: Copying extra folders</title><link>http://blogs.technet.com/mniehaus/archive/2009/10/01/mdt-2010-new-feature-21-copying-extra-folders.aspx</link><pubDate>Thu, 01 Oct 2009 20:05:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3284402</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3284402.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3284402</wfw:commentRss><description>&lt;P&gt;When MDT 2010 replicates content to a linked deployment share, you can choose whether to copy “standard folders” as part of that replication process.&amp;nbsp; These folders (Scripts, Tools, $OEM$, USMT) might be required by one or more of the task sequences being replicated, so we give you that option.&amp;nbsp; In the case of media, we always copy these four standard folders; you don’t get a choice as we assume everything in those folders is required by the current deployment share and therefore is also required by the media.&lt;/P&gt;
&lt;P&gt;We have periodically received requests to allow for the replication of additional folders to linked deployment shares, as well as the inclusion of additional folders when creating media.&amp;nbsp; As a result of those requests, we added a mechanism for specifying a list of extra folders.&amp;nbsp; But there’s one challenge for that:&amp;nbsp; We didn’t provide a user interface for configuring those, so you have to use PowerShell to do it.&amp;nbsp; Unfortunately the documentation doesn’t even mention that this is possible, so consider this blog entry a documentation addendum :-)&lt;/P&gt;
&lt;P&gt;From a PowerShell session, you would first need to load the MDT PowerShell snap-in (“Add-PSSnapIn Microsoft.BDD.PSSnapIn”) and then connect to the deployment share (simplest way is “Restore-MDTPersistentDrive” to get all the drives connected that you use in the Deployment Workbench).&amp;nbsp; In the case of linked deployment shares, you can get all the current properties like so:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_2.png" mce_href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb.png" width=475 height=249 mce_src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Then setting the ExtraFolders property (which is empty by default) is achieved using “Set-ItemProperty”:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_4.png" mce_href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb_1.png" width=470 height=268 mce_src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Because the ExtraFolders property is a list (array), you always need to specify the values as I did, using the PowerShell syntax of @(“Value1”, “Value2”).&amp;nbsp; If you only have a single value, it would look like @(“Value1”).&lt;/P&gt;
&lt;P&gt;Media works the same way:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_6.png" mce_href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_6.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb_2.png" width=477 height=254 mce_src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The folders you specify need to exist at the top level of the deployment share.&amp;nbsp; In my examples above, my deployment share is “C:\DeploymentShare” so the folders that must exist are “C:\DeploymentShare\MyFolder1” and “C:\DeploymentShare\MyFolder2”.&amp;nbsp; Make sure you specify folders that actually exist – otherwise you’ll get errors when MDT tries to copy those folders.&lt;/P&gt;
&lt;P&gt;After doing this, you’ll notice an additional line in the output, highlighted below, telling you how many extra folders were copied:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_8.png" mce_href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_8.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb_3.png" width=455 height=376 mce_src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature21Copyingextrafolders_8DC4/image_thumb_3.png"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3284402" width="1" height="1"&gt;</description></item><item><title>MDT 2010 New Feature #20: General Purpose ConfigMgr wizard</title><link>http://blogs.technet.com/mniehaus/archive/2009/09/30/mdt-2010-new-feature-20-general-purpose-configmgr-wizard.aspx</link><pubDate>Thu, 01 Oct 2009 00:58:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3284170</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3284170.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3284170</wfw:commentRss><description>&lt;P&gt;In MDT 2008, we provided unknown computer support for ConfigMgr 2007, since it didn’t provide that capability – you first had to import new computers into the ConfigMgr database before you could install an OS, so MDT helped automate that process.&amp;nbsp; When ConfigMgr 2007 R2 was released, it included unknown computer functionality, so we have now removed most of that from MDT 2010.&lt;/P&gt;
&lt;P&gt;One of the useful parts of this unknown computer process was a pre-execution hook that would run a wizard, leveraging the same wizard framework that we used for MDT 2010 Lite Touch deployments.&amp;nbsp; This was useful because we provided all the pieces to make it work:&amp;nbsp; the TSCONFIG.INI file that tells ConfigMgr what to run, the script that gets executed by ConfigMgr (referenced in TSCONFIG.INI), the rules processing logic to gather information from WMI and other data sources, and the wizard files themselves.&lt;/P&gt;
&lt;P&gt;With MDT 2010, we’ve left these pieces in place, but set them up to do something more basic: prompt for a new computer name.&amp;nbsp; This is provided as a sort of general purpose “sample”, showing how to hook this into ConfigMgr.&amp;nbsp; While you might not find the sample particularly useful, you can edit the wizard definition (using Notepad or something like the MDT Wizard Editor, &lt;A title=http://mdtwizardeditor.codeplex.com/ href="http://mdtwizardeditor.codeplex.com/" mce_href="http://mdtwizardeditor.codeplex.com/"&gt;http://mdtwizardeditor.codeplex.com/&lt;/A&gt;) to add additional panes.&lt;/P&gt;
&lt;P&gt;All the files related to this general purpose sample are located in the “C:\Program Files\Microsoft Deployment Toolkit\SCCM” directory:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;ZTIMediaHook.wsf.&amp;nbsp; This is the pre-execution hook script that drives the whole process (gathering information from WMI and other sources, then displaying the wizard).&lt;/LI&gt;
&lt;LI&gt;Deploy_SCCM_Definition_ENU.xml.&amp;nbsp; This file defines the wizard itself, which by default has one pane that asks for the computer name.&lt;/LI&gt;
&lt;LI&gt;Deploy_SCCM_Scripts.vbs.&amp;nbsp; This file contains the initialization and validation scripts called by the wizard pane (which don’t do much in this case).&lt;/LI&gt;
&lt;LI&gt;TSConfig.ini.&amp;nbsp; This file gets added to the boot image and tells ConfigMgr to run the ZTIMediaHook.wsf script.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;So if you wanted too do some customization, the files you would want to change are the “Deploy_SCCM_Definition_ENU.xml” (to add or change wizard panes) and “Deploy_SCCM_Scripts.vbs” (to specify additional initialization or validation logic).&lt;/P&gt;
&lt;P&gt;To actually get these pieces added into a boot image, you can check the “Add media hook files to enable the Deployment Wizard for this boot media” checkbox when running either the “Create Boot Image using Microsoft Deployment” wizard (which creates only new boot image which you would then need to configure the task sequence and ISOs to use) or the “Create Microsoft Deployment Task Sequence” wizard (which can create a new boot image as part of the task sequence creation process).&lt;/P&gt;
&lt;P&gt;Booting from this boot image, you should see a wizard that looks like this:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature20GeneralPurposeConfigM_D290/image_2.png" mce_href="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature20GeneralPurposeConfigM_D290/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature20GeneralPurposeConfigM_D290/image_thumb.png" width=438 height=330 mce_src="http://blogs.technet.com/blogfiles/mniehaus/WindowsLiveWriter/MDT2010NewFeature20GeneralPurposeConfigM_D290/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;You can then specify the computer name you want, which will set the OSDComputerName task sequence variable.&amp;nbsp; Like I said, pretty simple, but provided as a starting point for your own customizations – just edit the XML and VBS files, create a new boot image, and then deploy.&amp;nbsp; (Remember that all of these files are actually embedded in the boot image WIM file, so when you make changes you either need to create a new boot image or mount the existing one to change those files.&amp;nbsp; Update the distribution points after making changes.)&lt;/P&gt;
&lt;P&gt;I’ve also attached a short video that shows the startup process (including the initial ConfigMgr wizard screen that can be used for specifying static IP information and for typing in the media password).&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3284170" width="1" height="1"&gt;</description><enclosure url="http://blogs.technet.com/mniehaus/attachment/3284170.ashx" length="1101301" type="video/x-ms-wmv" /></item><item><title>ConfigMgr SP2 is speedy</title><link>http://blogs.technet.com/mniehaus/archive/2009/09/29/configmgr-sp2-is-speedy.aspx</link><pubDate>Wed, 30 Sep 2009 01:12:29 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3283921</guid><dc:creator>mniehaus</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/mniehaus/comments/3283921.aspx</comments><wfw:commentRss>http://blogs.technet.com/mniehaus/commentrss.aspx?PostID=3283921</wfw:commentRss><description>&lt;p&gt;People have made fun of ConfigMgr, and every version of SMS before that, for being “slow moving software”.&amp;#160; For those of you who try to deploy software to a machine and then wait for it to actually happen, you know what I mean: it was guaranteed to take two minutes from the time you advertised it to the time the first clients acted on it.&lt;/p&gt;  &lt;p&gt;With ConfigMgr SP2, a significant portion of that delay (which was actually happening on the client side, not on the server) was removed.&amp;#160; Now, I can add a new machine into a collection, then go to the machine and initiate a machine policy retrieval cycle and see a popup for new advertisements within a few seconds.&amp;#160; The first time that happened I was a bit startled by the result – surely something must be wrong.&amp;#160; But it wasn’t, the advertisement really was available that quickly.&lt;/p&gt;  &lt;p&gt;ConfigMgr SP2 is still available as an RC through &lt;a href="http://connect.microsoft.com"&gt;http://connect.microsoft.com&lt;/a&gt;, so you can try it out in your lab if you want.&amp;#160; It is expected to be released by the end of October.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3283921" width="1" height="1"&gt;</description></item></channel></rss>