<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Simply Does Not Work &#187; IT</title>
	<atom:link href="http://nicholas.piasecki.name/blog/category/it/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicholas.piasecki.name/blog</link>
	<description>Confessions of a small business software developer</description>
	<lastBuildDate>Thu, 20 May 2010 23:32:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SBS 2008 restarts unexpectedly when backup starts</title>
		<link>http://nicholas.piasecki.name/blog/2010/05/sbs-2008-restarts-unexpectedly-when-backup-starts/</link>
		<comments>http://nicholas.piasecki.name/blog/2010/05/sbs-2008-restarts-unexpectedly-when-backup-starts/#comments</comments>
		<pubDate>Thu, 20 May 2010 23:32:22 +0000</pubDate>
		<dc:creator>Nicholas Piasecki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[failure]]></category>
		<category><![CDATA[sbs-2008]]></category>

		<guid isPermaLink="false">http://nicholas.piasecki.name/blog/?p=622</guid>
		<description><![CDATA[Today, our SBS 2008 server restarted itself at 5:00 p.m. sharp. I mean on the dot.

That was disturbing enough in itself. When the system came back up, it helpfully asked me to type in &#8220;Why did the system shut down unexpectedly?&#8221; and I enthusiastically typed in &#8220;Fuck if I know you jackass.&#8221; Then, I headed [...]]]></description>
			<content:encoded><![CDATA[<p>Today, our SBS 2008 server restarted itself at 5:00 p.m. sharp. I mean <em>on the dot</em>.</p>

<p>That was disturbing enough in itself. When the system came back up, it helpfully asked me to type in &#8220;Why did the system shut down unexpectedly?&#8221; and I enthusiastically typed in &#8220;Fuck if I know you jackass.&#8221; Then, I headed straight for the event log.</p>

<p>The event log was full of terrifying messages such as</p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">The system failed to flush data to the transaction log. Corruption may occur.</pre></div></div>


<p>or</p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">An error was detected on device \Device\Harddisk1\DR2  during a paging operation.</pre></div></div>


<p>Hmm. There was no blue screen, no bug check, no minidump. It was as if the power had been cut.</p>

<p>I looked accusingly at the UPS since I have had problems with bad UPSs interrupting the power supply in the past. I held down its self-test button, it made that satisfying buzzing noise, and &#8230; everything stayed up.</p>

<p>But while crouched down next to the UPS, I heard an odd swishing noise, like a tiny man was running his finger across a sheet of Saran Wrap. Then I noticed that the external Western Digital hard drive that we use for SBS 2008 backup was doing its swooshing-lights mode, not its solid-lights mode, and I knew from previous experience that it only did that when it was starting up or shutting down.</p>

<p>I had a hunch&#8211;in SBS 2008, backup uses Volume Shadow Copy, and I had seen similar disk errors when another of our external hard drives cooked itself (though instead of rebooting, that server became unresponsive). I unplugged the external drive and the event log messages stopped.</p>

<p>I then promptly threw the external hard drive into the trash, drove straight to Best Buy and bought a new external hard drive with the company credit card. (Aside: Why do 90% of external hard drives come with craptastic backup software or &#8220;one-touch&#8221; buttons? I just want a drive in a box. I finally found one in the &#8220;Seagate Expansion&#8221; line.)</p>

<p>Then I plugged in the new external hard drive and re-ran the &#8220;Configure server backup&#8221; wizard from the SBS 2008 console. I unchecked the old, now non-existent drive, checked the new one, and off it went. And all seems happy now. (I ran <code>chkdsk</code> for good measure on the system and data drives and they checked out OK, so it does all seem related to the external backup drive cooking itself.)</p>

<p>Should it be capable of handling faulty backup hardware more gracefully? Sure. And I wish that SBS 2008 had the option to use the old <code>ntbackup</code> utility because then at least you could backup to network-attached storage. It&#8217;s been my experience that external hard drives really are not that reliable and have an average lifespan of only about two years, but maybe I have just been glaring at them the wrong way.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholas.piasecki.name/blog/2010/05/sbs-2008-restarts-unexpectedly-when-backup-starts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick Tip: Sharing a FedEx ZP 500 printer attached to a Windows XP computer to a Windows Vista/7 machine</title>
		<link>http://nicholas.piasecki.name/blog/2010/04/quick-tip-sharing-a-fedex-zp-500-printer-attached-to-a-windows-xp-computer-to-a-windows-vista7-machine/</link>
		<comments>http://nicholas.piasecki.name/blog/2010/04/quick-tip-sharing-a-fedex-zp-500-printer-attached-to-a-windows-xp-computer-to-a-windows-vista7-machine/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 22:30:46 +0000</pubDate>
		<dc:creator>Nicholas Piasecki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[printing]]></category>
		<category><![CDATA[quick-tip]]></category>
		<category><![CDATA[zebra]]></category>

		<guid isPermaLink="false">http://nicholas.piasecki.name/blog/?p=569</guid>
		<description><![CDATA[At Skiviez/WFS, we have a FedEx ZP 500 ZPL printer on the shipping desk. This is what FedEx is migrating everyone to now that the tried-and-true Zebra/Eltron LP2844* series is getting a little long in the tooth. (Along with a gradual migration to ZPL over EPL2, but that&#8217;s a rant for another day.)

The FedEx ZP [...]]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://www.skiviez.com/">Skiviez</a>/<a href="http://www.warehousefs.com/">WFS</a>, we have a FedEx ZP 500 ZPL printer on the shipping desk. This is what FedEx is migrating everyone to now that the tried-and-true Zebra/Eltron LP2844* series is getting a little long in the tooth. (Along with a gradual migration to ZPL over EPL2, but that&#8217;s a rant for another day.)</p>

<div id="attachment_571" class="wp-caption aligncenter" style="width: 185px"><a href="http://nicholas.piasecki.name/blog/wp-content/uploads/2010/04/printer_faq.jpg"><img src="http://nicholas.piasecki.name/blog/wp-content/uploads/2010/04/printer_faq.jpg" alt="" title="FedEx ZP 500" width="175" height="91" class="size-full wp-image-571" /></a><p class="wp-caption-text">FedEx ZP 500</p></div>

<p>The FedEx ZP 500 is a bit of a white elephant in that Zebra doesn&#8217;t mention it on their Web site; it&#8217;s some sort of special contract job with FedEx to produce and jointly brand these devices. It&#8217;s probably just a re-branded version of the Zebra GK420d, but in reality we have the printer manufacturer pretending that they don&#8217;t make the printer (e.g., &#8220;call FedEx for support&#8221;) and a shipping company who has no idea how to support the printer (e.g., &#8220;call Zebra for the printer driver&#8221;). But I&#8217;m getting distracted.</p>

<p>The real issue was that the shipping desk is running Windows XP and shares the printer via the native Windows printer sharing mechanism so that it&#8217;s listed in the Active Directory. I do this so that I can run integration tests from the workstation in my office and test the label generation functions of our software without needing to have a thermal label printer hooked up to my workstation solely for this purpose. These printers aren&#8217;t cheap, you know.</p>

<h2>New operating system, new drivers required</h2>

<p>I recently upgraded my workstation to Windows 7. When I tried to add the shared FedEx thermal printer, I was greeted with error code <code>0x00000007a</code> along with an error message that generally amounted to &#8220;something didn&#8217;t work.&#8221; I suspected a driver problem since Vista is when Microsoft locked down on the mandate that printer drivers run in user mode, not kernel mode&#8211;which is a good thing in terms of system stability, since a poorly-written printer driver can no longer trigger a BSOD and a reboot, but a bad thing in terms of backwards compatibility.</p>

<p>The problem is that</p>

<ul>
<li>the Windows XP machine is offering the Windows XP drivers to my Windows 7 install;</li>
<li>the Windows 7 printer wizard doesn&#8217;t give me a chance to supply my own printer drivers, and instead happily installs the XP ones, which don&#8217;t work;</li>
<li>the FedEx-supplied Vista drivers are mutually exclusive in terms of compatibility with the XP drivers, so I can&#8217;t install them on the XP machine via the <code>Server Properties</code> thingie; and</li>
<li>even if I could do that, I am hesitant to dick around with the printer drivers on a critical machine.</li>
</ul>

<h2>Adding the printer</h2>

<p>The solution was to add a printer in a different, counter-intuitive way. Here&#8217;s what I did:</p>

<ol>
<li>From the Windows 7 Control Panel, I went to &#8220;View devices and printers&#8221; and then &#8220;Add a printer&#8221;.</li>
<li>When asked &#8220;What type of printer do you want to install?&#8221; I chose <strong>Add a local printer</strong>, even though I know full damn well that I&#8217;m not actually adding a local printer.</li>
<li>For &#8220;Choose a printer port,&#8221; I chose &#8220;Create a new port&#8221; with &#8220;Type of port&#8221; set to &#8220;Local Port&#8221;.</li>
<li>In the &#8220;Enter a port name&#8221; dialog, I entered the UNC share name for the printer, which looks like <code>\\{MACHINE-NAME}\{PRINTER-SHARE-NAME}</code>. In my case, it was <code>\\ASHWHWS003\FedEx ZP 500 Plus</code>.</li>
<li>When asked for a driver, I chose &#8220;Have Disk&#8221; and navigated to the *.inf file in the ZD directory of the <a href="http://fedex.com/us/software/printerdrivers.html">Zebra Designer drivers</a> available from the FedEx Web site.</li>
</ol>

<p>This allowed me to use locally-available printer drivers on a printer attached to another machine. Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholas.piasecki.name/blog/2010/04/quick-tip-sharing-a-fedex-zp-500-printer-attached-to-a-windows-xp-computer-to-a-windows-vista7-machine/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Buying Software Sucks</title>
		<link>http://nicholas.piasecki.name/blog/2010/01/buying-software-sucks/</link>
		<comments>http://nicholas.piasecki.name/blog/2010/01/buying-software-sucks/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 22:50:35 +0000</pubDate>
		<dc:creator>Nicholas Piasecki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[cots]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[purchasing]]></category>
		<category><![CDATA[requirements]]></category>
		<category><![CDATA[salespeople]]></category>

		<guid isPermaLink="false">http://nicholas.piasecki.name/blog/?p=522</guid>
		<description><![CDATA[What follows is a rant about the state of marketing in the software industry.

We happen to like our system

So we&#8217;ve branched out and offered fulfillment services to other merchants, as I&#8217;ve mentioned before. Essentially, other e-commerce stores or merchants can store their items in our warehouse and then transmit orders as &#8220;fulfillment requests&#8221; to us. [...]]]></description>
			<content:encoded><![CDATA[<p>What follows is a rant about the state of marketing in the software industry.</p>

<h2>We happen to like our system</h2>

<p>So we&#8217;ve branched out and offered <a href="http://www.warehousefulfillmentservices.com/">fulfillment services to other merchants</a>, as I&#8217;ve mentioned before. Essentially, other e-commerce stores or merchants can store their items in our warehouse and then transmit orders as &#8220;fulfillment requests&#8221; to us. We either ship the request or mark it as invalid with a little message (&#8220;item has insufficient stock, delivery point validation failed, tax identification number required, etc.&#8221;). If they want to re-attempt, then they re-submit an entirely new fulfillment request.</p>

<p>This simple model has worked surprisingly well: the system doesn&#8217;t track &#8220;orders&#8221; (since each merchant handles backordering and cancellations differently), and while it does maintain an inventory log, it doesn&#8217;t track the cost of goods in inventory or anything like that, since that is not necessary for us to do our job. (Instead, it tracks a whole boatload of other information that people don&#8217;t normally think about, like HS codes or unit weight.)</p>

<h2>Some of our merchants need some hand-holding</h2>

<p>We have an API so merchants can integrate with our system. And so I&#8217;ve written a few plug-ins for Magento and osCommerce that auto-transmit their orders as fulfillment requests, sync outbound shipments back, and deduct inventory from their systems (since we are the authoritative inventory count). This works great for their retail businesses.</p>

<p>We have a merchant that we&#8217;ve been doing retail business with for some time who now wants to do wholesale stuff with us. He wants a sales order/invoicing/inventory management solution, and it needs to be able to track multiple inventories across multiple warehouses (our integration, if any, would only be adjusting inventory for a particular warehouse). He wants to enter sales orders remotely, press a button that shows him how much is ordered so he knows how much to make, have that manufactured and sent to us, click another button to transmit the sales order as a fulfillment request to us once it&#8217;s in stock, and then have us sync back with the shipment info, creating an invoice.</p>

<p>&#8220;Shouldn&#8217;t they have had these features prior to switching to you guys?&#8221; you ask. Well, yes. In this case, all of these features were provided in an all-in-one system provided by their previous fulfillment warehouse. They have since learned their lesson about keeping all of their data in the hands of a third party because when that relationship went south, so did their access to their own data.</p>

<p>We would rather not add these features to our system. Since all merchants have different ways of handling backorders, pre-orders, cancellations, cost of goods sold (FIFO, LIFO, average, priority), we&#8217;ve been maintaining the position that&#8211;unlike our competitors&#8211;our system is essentially feature complete, since it&#8217;s <em>ours</em> and does what <em>we</em> need it to do to ship things out. The features that I&#8217;ve mentioned <em>should</em> be things that the merchants are keeping track of themselves&#8211;since that&#8217;s their business&#8211;and integrate with our system via the programming API. While an argument could be made that our system would be abso-freaking-fantastic for merchants who need an all-in-one software and data solution (yes, it certainly would), the reality is that our competitors have an outsourced team of software developers, and we are a small business working in an area that is tangential to our core business as a result of the &#8220;new economy&#8221; that has a software development team of just one person (me) and can&#8217;t even begin to dream of hiring any more until we start seeing some serious cash flow.</p>

<p>In any case, to land this deal, we need to find a system for this merchant, and fast, because there are some important trade shows coming up.</p>

<h2>Welcome to marketing Hell</h2>

<p>Now for the rant, because you would think that these requirements are not exotic:</p>

<ul>
<li>Let salespeople enter sales orders remotely.</li>
<li>Keep track of inventory in multiple locations, and track the cost of inventory.</li>
<li>Provide integration hooks so the user can send orders to the warehouse and so the warehouse can send shipment data back.</li>
<li>Keep track of sales-order-to-invoice conversions and payments.</li>
<li>Provide reporting features.</li>
</ul>

<h3>QuickBooks 2010: Same as last year! Now with more shininess!</h3>

<p>You might take a look at integrating with QuickBooks, but you&#8217;d realize that once you&#8217;ve penetrated the marketing speak that the software in 2010 is essentially no different in terms of fundamental feature set as it was in 2006, and that it doesn&#8217;t support inventory in multiple locations and doesn&#8217;t scale well. In fact, QuickBooks performance once you start approaching 10,000 SKUs is so bad that they sell an &#8220;enterprise&#8221; version that essentially&#8211;aside from some fine-grained access permissions&#8211;has no added features other than the feature of not crashing when dealing with large lists of information.</p>

<p>We could pay another couple of thousand dollars for <a href="http://www.fishbowlinventory.com/products/pricing/">Fishbowl inventory</a>, which would add multiple location support to Quickbooks, but then we&#8217;d have created a Rube Goldberg machine straight out of the gate, with me synchronizing with Fishbowl which is then synchronizing with Quickbooks. I&#8217;m sure nothing would go wrong there. That would be insane; we might as well just stick a few fax machines into the sync process and call it an insurance company.</p>

<h3>A gap in the market</h3>

<p>The reality is that there is a huge gap in the marketplace between merchants who are moving $200k or less per year&#8211;just use commercial off-the-shelf (COTS) QuickBooks, you can do most things manually and use your e-commerce system&#8217;s native order management functions&#8211;and merchants who are moving $5m or more&#8211;just use SAP or some other enterprisey software. If you&#8217;re in between, like we are and like the merchant that I&#8217;m researching for is, the options available to you are not pretty.</p>

<p>I&#8217;m not sure why this is. All I can think of is that perhaps companies historically did not spend much time in this space&#8211;they either stayed small or had venture capital to acquire the big boy systems and grow quickly. People aren&#8217;t exactly lending money anymore, so I suspect that this is a segment that is only going to grow.</p>

<p>If you try to look for COTS software in this segment, you&#8217;ll never find the feature matrix that you need:</p>

<ul>
<li><a href="http://www.inflowinventory.com/">inFlow Inventory</a> is pretty, but offers no integration features, as if an entire business could be run out of one app, and doesn&#8217;t offer Web access.</li>
<li><a href="http://www.workingpoint.com/">WorkingPoint</a> is Web-based but doesn&#8217;t offer inventory tracking in multiple locations or an integration API.</li>
<li><a href="http://quickbooks.intuit.com/">QuickBooks</a> has a <a href="http://www.vi4qb.com/">Web-based</a> extension that lets QuickBooks understand multiple inventories but costs thousands of dollars, assumes that the company owns its own warehouse (that is, needing picking/packing/shipping capabilities), and still does the same style of synchronization as Fishbowl does. You&#8217;d think Intuit would just add the @#$#@ feature to QuickBooks itself!</li>
</ul>

<h3>No COTS to sleep in</h3>

<p>The market seems to have determined that people in this segment have outgrown COTS software and need some consulting help. So any Web sites that advertise products will be full of pages and pages of <a href="http://www.netsuite.com/portal/home.shtml">impenetrable marketing bullshit</a> that use obnoxious acronyms like ERP, CRM, MRP, and WMS, promise the moon, and coyly make no reference to pricing or contract requirements so you can&#8217;t even tell if you&#8217;re dealing with the right league of product, when the reality is at the end of the day you could look at two or three screenshots and the SDK&#8217;s API and immediately tell if the product fit your needs.</p>

<p>Instead, I notice a disturbing trend of &#8220;pretty Web site, crap product,&#8221; such as <a href="http://www.simplyaccounting.com/productsServices/compare_products/?WT.mc_id=hp_comp">Sage&#8217;s Simply Accounting</a>, which certainly appears to have an impressive array of features but in reality doesn&#8217;t even know the difference between a <a href="http://en.wikipedia.org/wiki/Sales_order">sales order</a> and an <a href="http://en.wikipedia.org/wiki/Invoice">invoice</a>. You can try going to <a href="http://www.microsoft.com/dynamics/en/us/default.aspx">Microsoft&#8217;s Dynamics site</a>, but good luck figuring out what the difference between Dynamics AX, Dynamics CRM, Dynamics NAV, and Dynamics GP are: you&#8217;ll be told to contact your &#8220;Microsoft Dynamics solutions representative&#8221; for help. At that point, you&#8217;re thinking &#8220;Microsoft solutions representative? Who said I committed to Microsoft?! I&#8217;m just trying to figure out <em>what in the blue hell your product even <strong>does</strong></em>.&#8221;</p>

<p>If you do find a vendor that maybe sorta-kinda-hard-to-tell meets your solutions, then you can expect days of scheduling WebEx teleconferences and meetings and run-around with your &#8220;account rep&#8221; so that they can determine how much you&#8217;re worth and willing to pay so that <a href="http://www.endicia.com/Developers/">they can charge you a completely different amount</a> than what they charged Bob next door for the same services and bits. Trying to extract &#8220;$X/user&#8221; and &#8220;the login starts working on MM/DD/YYYY&#8221; and &#8220;the developer get a demo account so if you can know if this is feasible&#8221; answers from these people seems to require a hammer in one hand and their genitals in the other. We both know that to add a new account, they&#8217;re pressing a button that says &#8220;they really bought into that &#8216;enterprise&#8217; crap&#8221; and poof! a new account is created. Let&#8217;s quit pretending that the world&#8217;s carbon footprint has increased ten-fold by us merely asking to be on the platform.</p>

<p>Trying to extract technical capabilities from these salespeople is nigh-impossible either. I think part of the problem is that they seem to actually believe that the features that they are promising really exist, when in reality I just need them to show me what the data dictionary looks like and how the session needs to be handled and then I can tell for myself whether or not my scenario is actually supported. Instead? I&#8217;m waiting on a &#8220;discovery session&#8221; teleconference with an &#8220;engineer&#8221; tomorrow.</p>

<h2>Conclusions and Delusions</h2>

<p>It has to be easier than this. No wonder there are so many not-invented-here software solutions in the world today&#8211;custom crap that barely works at home may yet indeed be better than generic crap that you have to waste hundreds of dollars on in productivity time and research before you even get it in your hands and realize that it is also crap, just with a maintenance contract.</p>

<p>If it takes a consultant to help people decide what software to buy, or which of your products is right for them, or whether or not your product <em>even applies to their problem domain</em>, then your marketing <em>simply does not work.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://nicholas.piasecki.name/blog/2010/01/buying-software-sucks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Programmatically updating software deployed via Group Policy</title>
		<link>http://nicholas.piasecki.name/blog/2009/11/programmatically-updating-software-deployed-via-group-policy/</link>
		<comments>http://nicholas.piasecki.name/blog/2009/11/programmatically-updating-software-deployed-via-group-policy/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 17:38:40 +0000</pubDate>
		<dc:creator>Nicholas Piasecki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[it-stuff]]></category>
		<category><![CDATA[windows installer]]></category>
		<category><![CDATA[wix]]></category>

		<guid isPermaLink="false">http://nicholas.piasecki.name/blog/?p=399</guid>
		<description><![CDATA[At work, I&#8217;ve written a small application called the &#8220;Fulfillment Manager.&#8221; From a user&#8217;s perspective, it&#8217;s an extremely simple application. It shows the current order counts for all of the stores that we ship for, and if you scan a barcode, it figures out what store that barcode belongs to, determines if the order the [...]]]></description>
			<content:encoded><![CDATA[<p>At work, I&#8217;ve written a small application called the &#8220;Fulfillment Manager.&#8221; From a user&#8217;s perspective, it&#8217;s an extremely simple application. It shows the current order counts for all of the stores that we ship for, and if you scan a barcode, it figures out what store that barcode belongs to, determines if the order the barcode corresponds to needs to be packed or shipped, and prints out a receipt/packing slip or USPS/FedEx shipping label and supporting shipping documentation automatically. Most operations involve just scanning the barcode and pressing enter.</p>

<div id="attachment_400" class="wp-caption aligncenter" style="width: 310px"><a href="http://nicholas.piasecki.name/blog/wp-content/uploads/2009/11/fm.png"><img src="http://nicholas.piasecki.name/blog/wp-content/uploads/2009/11/fm-300x225.png" alt="Yes, it epitomizes &quot;Battleship Grey.&quot; You love it." title="Fulfillment Manager" width="300" height="225" class="size-medium wp-image-400" /></a><p class="wp-caption-text">Yes, it epitomizes Battleship Grey. You love it.</p></div>

<p>But, behind the scenes, it&#8217;s not quite as simple as all of that. It&#8217;s aggregating order data from heterogeneous data sources&#8211;some in our legacy database, some in our new fulfillment system, some in a custom integration with a third party. It has to figure out which postage account to pay for postage with or which FedEx account number to use to ship a package. For orders that aren&#8217;t coming from <a href="http://www.warehousefulfillmentservices.com/">our new fulfillment system</a>, it has to &#8220;cleanse&#8221; the address against the current USPS address database. It has to figure out the cheapest way to ship a package, compute customs values correctly, generate certificates of origin and commercial invoices for international shipments, and determine what box types an order is allowed to be packed in. And it has to write shipment information back to one of those three disparate data sources.</p>

<p>What this means is that I&#8217;m frequently making adjustments and bug fixes to the application. And managing the deployment and installation of those bug fixes had been, up until now, a pain.</p>

<h2>A brief interlude on ClickOnce</h2>

<p>The other internal application that we use (&#8220;Undies Client&#8221;) for our <a href="http://www.skiviez.com/">long-time running e-commerce store</a> is deployed via <a href="http://en.wikipedia.org/wiki/ClickOnce">ClickOnce</a>, which is essentially the Java Web Start of the .NET world.</p>

<p>While ClickOnce is a neat technology and has its applications, to be sure, I probably wouldn&#8217;t use it again on Undies Client if I were starting that application over today, just as I decided not to use it for the Fulfillment Manager (which is an effort to divorce the processing and shipping features from Undies Client and make them simpler and applicable to multiple e-commerce stores).</p>

<p>First, there&#8217;s user confusion. If I deploy a Windows Installer MSI via Group Policy, then the application is magically there on all computers in the office. But for Undies Client, you have to go to a special Web page and click on a link. With ClickOnce, the installation happens per user, so employees can get confused if they go to another computer one day, log into their account, and see that the app isn&#8217;t there (&#8220;but Jennifer runs it on this computer so I thought it was already installed&#8221;).</p>

<p>Second, there&#8217;s deployment headaches. Like Java Web Start, you get a retarded warning if the deployment manifest wasn&#8217;t signed with an expensive code signing certificate. To mitigate that, you either buy one or start diddling with the self-signing certificate capability within the context of your own Active Directory domain. Not a show-stopper, and it makes sense, I guess, but it&#8217;s One More Thing that you have to deal with.</p>

<p>Third, when that certificate expires and needs to be renewed, <a href="http://stackoverflow.com/questions/149718/pitfalls-gotchas-of-click-once-smart-client-deployment-in-net/293503#293503">you&#8217;re in for a world of hurt</a>, because essentially all users will need to uninstall and re-visit the Web site download link and reinstall. Otherwise, the application simply stops seeing the newer updated versions and doesn&#8217;t update itself.</p>

<p>Fourth, the distribution of your app now has a dependency on an IIS installation somewhere, so that&#8217;s something else to maintain&#8211;both the configuration of that virtual directory in IIS as well as the shared drive to which Visual Studio dumps its files when clicking the &#8220;Publish&#8221; button.</p>

<p>Fifth, the installation can&#8217;t do much. Until recently, you couldn&#8217;t even create an icon on the desktop as part of the installation process. Nor can you do anything that would require elevated permissions for actions that you might typically do when running an installer, such as registering a COM DLL, or installing some third-party dependency. So the Web page at which you download the app usually contains things like &#8220;ooh be sure to install this that and the other first,&#8221; defeating the deployment simplicity of ClickOnce. And if you need to update one of those third party dependencies and your app because dependent on one of those updates, you have no way to update that dependency with ClickOnce, unless you take it upon yourself to have your application manage the upgrade during its next run. That&#8217;s just more work than you shouldn&#8217;t have to do.</p>

<p>After writing all of this, it may seem like I am saying that ClickOnce is a half-baked load of crap; it&#8217;s not half-baked. I&#8217;m saying it&#8217;s a fully-baked, complete load of crap. (Kidding. ClickOnce has its applications for applications that can be completely self-contained, but if at any point you become dependent on anything COM, it&#8217;s time to move on to real deployment technology.)</p>

<h2>Using WiX to create a Windows Installer MSI file</h2>

<p>I&#8217;ve blogged about <a href="http://wix.sourceforge.net/">WiX</a> before. It&#8217;s a great open source tool put together by some guys who decided to write a reasonable mechanism for generating Windows installers because, for some reason, the Windows installer team has seemed to think that editing database tables in a cheeseball editor called <a href="http://msdn.microsoft.com/en-us/library/aa370557%28VS.85%29.aspx">Orca</a> was sufficient. This would be like saying that our warehouse workers could ship orders by updating data in a Microsoft Excel spreadsheet.</p>

<p>You could also pay lots of money for InstallShield or something similar, which would create MSI installers for you, but installation is a convenience for <em>me</em>&#8211;as a small business whose primary focus is not end-user software, paying for that doesn&#8217;t make much sense. There&#8217;s also <a href="http://nsis.sourceforge.net/Main_Page">NSIS</a>, but, oh&#8211;I just threw up all over myself. We&#8217;ll save NSIS for another post.</p>

<p>Additionally, the WiX guys have realized that installers usually need to do useful things, like install certificates, set up Web sites in IIS, and run database scripts, whereas the Windows Installer team seems to have been trying to make writing custom actions harder, not easier, with their subsequent releases, because that&#8217;s where most of the crashes and problems in setup packages happen. With WiX, we now have a suite of well-tested custom actions that lots of people are using; this should have been the Installer team&#8217;s original response instead of depending on the community and third parties to fill in this gap for them, but it is what it is.</p>

<p>The point is that WiX enables a whole class of small business developers like me to build first-class deployment methods into their applications. With a 300-odd line XML file, the Fulfillment Manager now builds to an MSI file. And since WiX integrates with Visual Studio, I can generate that XML file as part of my build process.</p>

<p>Indeed, I&#8217;ve set up <a href="http://www.jetbrains.com/teamcity/index.html">TeamCity</a> and use this as a continuous integration server. Whenever I commit a change to Subversion, TeamCity picks up the change, compiles the solution, runs the tests, and if they pass, copies the newly generated MSI file to a network share for potential deployment. It&#8217;s pretty sweet.</p>

<p>The missing piece of the puzzle, then, is actually getting this freshly baked MSI file onto all of the client machines in the office.</p>

<h2>Deploying via the Group Policy Software Installation Extension</h2>

<p>My first instinct was to use the Group Policy Software Installation Extension. This is the thingie where when you open up a group policy in the Group Policy Management Editor, you can drill down to the Software Installation thing under Computer Configuration, specify an MSI file for deployment, and (presto!) any computers linked to that GPO will install the MSI on next boot.</p>

<p>This worked swimmingly well for the first release of Fulfillment Manager.</p>

<h3>We pause for another brief interlude on update strategies</h3>

<p>Let me explain the design of the installation for a moment. I&#8217;ve written my WiX file such that each new MSI file that it generates is a &#8220;major upgrade&#8221; in the Windows Installer parlance&#8211;it has a different product code, a different package code, and a different version number (since my version numbers are a combination of an incrementing build number and the Subversion revision number). But they all have the same upgrade code and I schedule <code>RemoveExistingProducts</code> during the install.</p>

<p>This means that if you have an older version of the Fulfillment Manager on your machine and double-click the MSI file for a newer, updated version, you don&#8217;t have to do anything&#8211;the existing version is completely uninstalled and the new version is installed on top of it.</p>

<p>The Windows Installer has support for <a href="http://msdn.microsoft.com/en-us/library/aa370037%28VS.85%29.aspx">&#8220;minor upgrades&#8221;</a> and <a href="http://msdn.microsoft.com/en-us/library/aa370037%28VS.85%29.aspx">&#8220;small updates&#8221;</a>, but I can never keep the damn things straight. Can I add a new component? Can I change a file? Can I reorganize a feature? Do I really want to be thinking about this every time I press Build in Visual Studio? My application is small, so I think it&#8217;s far easier and more reassuring to just blow away the whole thing and install again during an update, starting with a clean slate each time. In fact, I think this is a reasonable approach for many reasonably-sized applications (Paint.NET, for example, does this) and only becomes a problem when you start getting really large (such as Visual Studio or Microsoft Word).</p>

<h3>Getting the update out there</h3>

<p>OK. So all I really need to do is get all of the client computers to run <code>msiexec /i FulfillmentManager.msi</code> on the MSI and I&#8217;ll be good to go.</p>

<p>You might think that I could just overwrite the old MSI file on the network share with the new one, and the computers would notice the change at the next boot. But you would be, as I was, a fool&#8211;machines that already had the install would not notice the change and machines that did not have the install would freak out because they could not find the correct MSI file. <a href="http://serverfault.com/questions/81492/touching-software-deployment-group-policy-programmatically-or-via-script">After positing my question on ServerFault</a>, I discovered the way the Group Policy Software Installation Extension works is by creating an advertisement script (*.aas file) and referencing that script via an object sitting in the Active Directory. That LDAP entry and the script file both do annoying things like reference a specific package code and product code, both of which I change with every new build of my software. So this method is out for the count.</p>

<p>Similarly, lugging out the Group Policy Editor and trudging down to the package entry and clicking &#8220;Redeploy application&#8230;&#8221; won&#8217;t work for the reasons described above&#8211;except that it&#8217;ll break the machines that already have the software installed, too.</p>

<p>What works is lugging out the Group Policy Editor, trudging down to the package entry, clicking &#8220;Remove&#8221; and &#8220;Immediately remove&#8221;, and then adding the package right back. This creates an updated *.aas file and correspondingly updated LDAP entries, and the old LDAP entry is flagged with a &#8220;remove me now please&#8221; flag. This works, but there are three things that I don&#8217;t like about it:</p>

<ul>
<li>It&#8217;s a manual process, so I have to remember to do it every time I create a new deployable build.</li>
<li>References to all of the old versions hang around by necessity, since it&#8217;s recording the fact that &#8220;hey, if I see this particular product code then I need to uninstall it.&#8221; Indeed, upon inspecting the SYSVOL share, I saw that there about 45 of such files sitting in there since development of this app started in early July.</li>
<li>There is no way to perform this process programmatically. (Well, there is, it&#8217;s <a href="http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-GPSI%5D.pdf">documented as part of the EU anti-trust settlement</a>, but let&#8217;s get real now: if it has LDAP in the spec then <a href="http://stackoverflow.com/questions/552130/what-obscure-syntax-ruined-your-day/552197#552197">I&#8217;m not touching it with a ten-foot pole</a>. Plus, this would be work that is totally tangential to my problem, which is automating a 1-minute task that ignores the crap out of me. At several days&#8217; worth of work, it&#8217;d take me a long time to climb out of that time deficit to realize any savings.)</li>
</ul>

<h2>Nirvana: Automatic updating</h2>

<p>The Software Installation extension for Group Policy can do a lot of things that I don&#8217;t need, like using patches or transforms, or shifting installed software by just moving a computer to a different OU, when at the end of the day all I really wanted was something that looked like this:</p>

<div id="attachment_404" class="wp-caption aligncenter" style="width: 282px"><a href="http://nicholas.piasecki.name/blog/wp-content/uploads/2009/11/Install.png"><img src="http://nicholas.piasecki.name/blog/wp-content/uploads/2009/11/Install-272x300.png" alt="Must this be so difficult?" title="Ideal Install Process" width="272" height="300" class="size-medium wp-image-404" /></a><p class="wp-caption-text">Must this be so difficult?</p></div>

<p>Since my installer will uninstall any previous versions, all I need to do is run the installation package via <code>msiexec</code>. This is easy enough to do via batch script that I&#8217;ve configured to run at startup via group policy, since those batch scripts run as SYSTEM and will have the necessary privileges to complete successfully.</p>

<p>You would think that in addition to <code>/i</code> and <code>/x</code> (and the idiotic <code>/vomus</code>), <code>msiexec</code> would have a somewhat useful parameter called, oh, I don&#8217;t know, <code>/install-it-only-if-the-damn-thing-isn't-already-installed</code>, but that would be a useful feature, so of course the Windows Installer team didn&#8217;t actually implement it.</p>

<p>Now, granted, there is actually no harm in running my installer when my app is already installed. It just would check that all the components are indeed installed and exit. But this still leaves a bad taste in my mouth. Not all MSI&#8217;s that I want to use in this way might behave like this. And, if I have any custom actions, that means that they&#8217;ll also get run on every boot, which seems like a waste.</p>

<p>While I could spelunk through the registry to try and see if I can find my current product code in the list, I&#8217;d rather not do that, because (1) that might not work consistently on all versions of Windows and (2) really, I&#8217;m just not that comfortable with batch scripts to begin with.</p>

<p>What ended up doing is writing a little command-line program called <code>msicheck</code>. The <a href="http://nicholas.piasecki.name/blog/wp-content/uploads/2009/11/msicheck.c.txt">source file</a> is boring and decently commented. Because all of the Windows Installer APIs are in C, my utility is in C. I briefly thought about writing it in C# with some interop, because I hate C just that much, but that did seem awfully overkill for such a simple application.</p>

<p>Ah, C in Windows. I had long forgotten the days of Hungarian variable names that sound like Yosemite Sam cussing (&#8220;<code>lpszPackageVer</code>&#8220;) and the land of <code>if ("swizzle" == "swizzle")</code> returning false. Heck, I had forgotten the days of not evening having <code>false</code>! I digress; the code is probably awful, but seems to work well enough for my purposes.</p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&gt; msicheck.exe /?
&nbsp;
Determines if a given Windows Installer package is installed.
&nbsp;
msicheck package
&nbsp;
Exit Codes:
        0       Exact version installed
        1       General failure
        2       Path to MSI package not found or not accessible
        3       Error determining package status
        4       Newer version installed
        5       No version installed
        6       Older version installed</pre></div></div>


<p>All <code>msicheck</code> does is take the full path to an MSI file as an argument and returns an exit code that indicates the status of that particular package by looking at the product code and the version. (That is, if the product code is not installed, it returns 5; if the same product code is found, it compares the version and returns 0, 4, or 6.) I call it in my batch script (which, I don&#8217;t do this for a living, it&#8217;s probably retarded) like so:</p>


<div class="wp_syntax"><div class="code"><pre class="batch" style="font-family:monospace;">@ECHO OFF
&nbsp;
REM ---------------------------------------------------------------------
REM VARIABLES
REM ---------------------------------------------------------------------
&nbsp;
SET path=\\SKIVIEZSBS2008\Group Policy Installations\Fulfillment Manager\
SET package=%path%Skiviez.FulfillmentManager.Installer.WinForms.msi
SET msicheck=%path%msicheck.exe
&nbsp;
ECHO Checking installed version of Fulfillment Manager...
&nbsp;
&quot;%msicheck%&quot; &quot;%package%&quot;
&nbsp;
IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 (
	echo Fulfillment Manager is up to date.
) ELSE (
	IF ERRORLEVEL 5 (
		echo Installing latest version...
		%SYSTEMROOT%\system32\msiexec /qn /i &quot;%package%&quot;
		IF ERRORLEVEL 0 (
			echo Fulfillment Manager successfully updated.
		) ELSE (
			echo Errors may have occurred during installation.
		)
	) ELSE (
		echo Newer version installed or error occurred.
	)
)</pre></div></div>


<p>Keeping in mind that <code>IF ERRORLEVEL 5</code> evaluates to true for error levels of 5 <em>or greater</em>, this means that I call <code>msiexec</code> only if the product isn&#8217;t installed or if an older version is installed.</p>

<h2>Conclusions and Delusions</h2>

<p>So, by using a batch script and my <code>msicheck</code> utility, I have things the way I want them. I commit a change; TeamCity builds it, runs the tests, and copies the resulting MSI to the network share that is referenced in my batch script; and the batch script runs at the next boot, uses <code>msicheck</code> to note that that package is not installed, and so runs <code>msiexec</code> to install the update (which removes the old version as part of the install process).</p>

<p>It&#8217;s certainly not applicable to every software deployment scenario, much like ClickOnce, but hopefully it&#8217;ll help someone out there who wanted to do something similar.</p>

<p><a href='http://nicholas.piasecki.name/blog/wp-content/uploads/2009/11/MsiCheck.zip'>Download MsiCheck, which requires Windows Installer 4.5 to run.</a> Complete with the &#8220;works on my machine!&#8221; guarantee of absolutely no warranties.</p>

<p>Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholas.piasecki.name/blog/2009/11/programmatically-updating-software-deployed-via-group-policy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;The data area passed to a system call is too small&#8221; and other idiocies when installing a Zebra LP2844 printer driver</title>
		<link>http://nicholas.piasecki.name/blog/2009/08/the-data-area-passed-to-a-system-call-is-too-small-and-other-idiocies-when-installing-a-zebra-lp2844-printer-driver/</link>
		<comments>http://nicholas.piasecki.name/blog/2009/08/the-data-area-passed-to-a-system-call-is-too-small-and-other-idiocies-when-installing-a-zebra-lp2844-printer-driver/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 01:06:17 +0000</pubDate>
		<dc:creator>Nicholas Piasecki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[printing]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[zebra]]></category>

		<guid isPermaLink="false">http://nicholas.piasecki.name/blog/?p=332</guid>
		<description><![CDATA[For reasons that would bore most to tears, I had to swap out a workstation at work today. This workstation had one Zebra LP2844 laser printer attached to it, and along with the &#8220;new&#8221; (well, new-to-that-particular-desk, not new-to-the-world) workstation, it was getting another.

Simple! The &#8220;new&#8221; workstation already had the Zebra LP2844 printer drivers installed, so [...]]]></description>
			<content:encoded><![CDATA[<p>For reasons that would bore most to tears, I had to swap out a workstation at work today. This workstation had one Zebra LP2844 laser printer attached to it, and along with the &#8220;new&#8221; (well, new-to-that-particular-desk, not new-to-the-world) workstation, it was getting another.</p>

<p>Simple! The &#8220;new&#8221; workstation already had the Zebra LP2844 printer drivers installed, so I&#8217;ll just Start > Printers > Add Printer > Yep, LPT1: > Mmhmm, ZEBRA EPL > (scrolling &#8230; scrolling &#8230; Why is this dialog box so small? &#8230; scrolling) ah, LP2844 > Continue Anyway (Why can&#8217;t a million dollar company get their drivers signed?) > Finish, insto presto, and&#8230;.</p>

<p>Boom. &#8220;Printer Driver was not installed. The operation could not be completed.&#8221;</p>

<p>Hum.</p>

<p>I&#8217;ll try it again. This is an indication of insanity&#8211;expecting a different result from the same operation&#8211;but it&#8217;s 7:30 a.m. and I can&#8217;t be experiencing problems already. Come on.</p>

<p>Boom. &#8220;Printer Driver was not installed. The operation could not be completed.&#8221;</p>

<p>Okay, I&#8217;ll just download Zebra&#8217;s driver setup utility and install the printer that way. Next > Next > Add a printer > Next > Next, and&#8230;.</p>

<p>Boom. &#8220;The data area passed to a system call is too small.&#8221;</p>

<p>Hum. That&#8217;s a new one. But different!</p>

<p>I know this printer works, why is this not working?</p>

<h2>The Solution</h2>

<p>After about 30 minutes of head-scratching, I stumbled upon the solution. These types of errors are apparently the result of corrupted or just plain buggy printer drivers already installed on the machine. They could be unrelated to the printer that you&#8217;re trying to install; it doesn&#8217;t matter. They&#8217;ll cause the error when the &#8220;add a printer&#8221; mechanism enumerates through the list of printer drivers already installed on the machine.</p>

<p>To fix it, it&#8217;s time to blow away some printer drivers. Go to <code>Printers</code> under the <code>Control Panel</code>. Click <code>File</code> > <code>Server Properties</code> and switch to the <code>Drivers</code> property sheet. Remove any suspicious-looking drivers and try to add your printer again. (For me, the problematic driver was a custom LP2844 driver that came on a UPS WorldShip disk.)</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholas.piasecki.name/blog/2009/08/the-data-area-passed-to-a-system-call-is-too-small-and-other-idiocies-when-installing-a-zebra-lp2844-printer-driver/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Getting WINS-like computer name resolution over VPN in SBS 2008</title>
		<link>http://nicholas.piasecki.name/blog/2009/06/getting-wins-like-computer-name-resolution-over-vpn-in-sbs-2008/</link>
		<comments>http://nicholas.piasecki.name/blog/2009/06/getting-wins-like-computer-name-resolution-over-vpn-in-sbs-2008/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 21:01:15 +0000</pubDate>
		<dc:creator>Nicholas Piasecki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[dhcp]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[it-stuff]]></category>
		<category><![CDATA[sbs-2008]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://nicholas.piasecki.name/blog/?p=271</guid>
		<description><![CDATA[So this week concluded several sleepless nights and much heartburn as I migrated Skiviez&#8217;s SBS 2003 machine (running as our domain controller and our mail server) to SBS 2008. As far as things go, it went relatively smoothly, and the remainder of the week was dealing with lots of small niceties that I had forgotten [...]]]></description>
			<content:encoded><![CDATA[<p>So this week concluded several sleepless nights and much heartburn as I migrated Skiviez&#8217;s SBS 2003 machine (running as our domain controller and our mail server) to SBS 2008. As far as things go, it went relatively smoothly, and the remainder of the week was dealing with lots of small niceties that I had forgotten that I had set up on the 2003 server that I now needed to set up once again.</p>

<p>One of these was something that I used for my convenience over a VPN connection from home. You see, the internal order processing application that I wrote uses some shared folders to store some temporary data, such as e-mails that are generated but not yet released to Exchange, or a local copy of images that are available on the Web site. This software&#8211;and our users&#8211;are used to referring to Windows file shares as <code>\\COMPUTER-NAME\SHARE-NAME</code>; for example, <code>\\CYRUS\Pickup Holding</code>, because for some reason some of the older servers are named after my boss&#8217;s dead cats.</p>

<p>When connecting through VPN to SBS 2008, however, that &#8220;suffix-less&#8221; name resolution was not working. So when <code>\\CYRUS\Pickup Holding</code> failed to resolve to anything, <code>\\cyrus.skiviez.com\Pickup Holding</code> would work fine. This was super annoying.</p>

<p>The reason this worked previously with our SBS 2003 installation is that it was acting as a WINS server, which provided this type of computer name resolution for us. SBS 2008 finally retires this ancient technology by default, however, so I had two choices: I could either install the WINS server role on SBS 2008, or I could just figure out how to get the <code>015 DNS Domain Name</code> option from DHCP to relay through the VPN connection.</p>

<p>I chose the latter option, since it&#8217;s certainly less confusing to be able to say to someone in the future &#8220;we don&#8217;t use WINS, DNS does everything.&#8221; So here&#8217;s how to do it:</p>

<ol>
<li>On the SBS 2008 server, click Start > Administrative Tools > Routing and Remote Access.</li>
<li>In the tree view, drill down past the server name to IPV4 > General. Right-click the General option and choose &#8220;New Routing Protocol&#8221; and choose DHCP Relay Agent.</li>
<li>Now right-click the newly appended &#8220;DHCP Relay Agent&#8221; node and choose Properties. Add the IP address of your DHCP server (which is probably your SBS server itself), and click OK. Then click it again and choose &#8220;New Interface&#8221; and add the &#8220;Internal&#8221; interface.</li>
<li>Now if you connect through VPN, an <code>ipconfig /all</code> should show your domain name as a &#8220;Connection-specific DNS suffix&#8221; and pinging machines by their suffix-less computer names should work. (If it doesn&#8217;t, make sure your DHCP server is using that <code>015 DNS Domain Name</code> option, which the SBS 2008 wizards set up by default.)</li>
</ol>

<p>Happy file sharing!</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholas.piasecki.name/blog/2009/06/getting-wins-like-computer-name-resolution-over-vpn-in-sbs-2008/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
