<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB"><title type="html">Nigel Watling</title><subtitle type="html">security and identity for developers</subtitle><id>http://blogs.msdn.com/b/nigelwa/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/nigelwa/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2005-05-04T16:17:00Z</updated><entry><title>July CTP and www.netfx3.com sandbox</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/archive/2006/07/17/669024.aspx" /><id>http://blogs.msdn.com/b/nigelwa/archive/2006/07/17/669024.aspx</id><published>2006-07-18T01:49:00Z</published><updated>2006-07-18T01:49:00Z</updated><content type="html">&lt;DIV class=BlogPostContent&gt;
&lt;P&gt;At last! The &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=62057A6F-185F-41DB-ABE5-678F6FC388F0&amp;amp;displaylang=en"&gt;.NET Framework 3.0 -&amp;nbsp;July 2006 CTP&lt;/A&gt;&amp;nbsp;has arrived. This is the&amp;nbsp;drop we've all&amp;nbsp;been waiting for. The issues&amp;nbsp;with the Windows CardSpace in the June CTP have been fixed. If you want to experiment with CardSpace there is no better build to install and play with. This build is fom the RC1 fork so&amp;nbsp;changes from this point on should (&amp;lt;insert normal disclaimer&amp;gt;) be few and far between.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Targeting this build, the nice people at Telligent have added Information Card support to Community Server 2.1 for our community site, &lt;A href="http://wcs.netfx3.com/"&gt;http://wcs.netfx3.com&lt;/A&gt;. If you&amp;nbsp;browse to &lt;A href="http://sandbox.netfx3.com/"&gt;http://sandbox.netfx3.com&lt;/A&gt;&amp;nbsp;using &lt;A href="http://www.microsoft.com/windows/ie/downloads/default.mspx"&gt;IE7 Beta 3&lt;/A&gt; and you have the July CTP installed you will be able to use Information Cards to register and logon to the site.&lt;/P&gt;
&lt;P&gt;We're currently using a standard SSL certificate&amp;nbsp;with the sandbox so when the CarSpace Trust Dialog pops up you will not see any logos and you will be warned that it is not a High Assurance SSL certificate:&lt;/P&gt;
&lt;P&gt;"This site does not meet Windows CardSpace requirements for a bank or major Internet business..." &lt;/P&gt;
&lt;P&gt;This illustrates the value of High Assurance certs and their integration with CardSpace. If a website uses an HA cert users who login using Information Cards can have a high(er) degree of confidence in the identity of the site - it meets a higher verification bar&amp;nbsp;at the Certificate Authority. &lt;/P&gt;
&lt;P&gt;Furthermore, if a bad guy attempts to phish users by drawing them to a site&amp;nbsp;copying the genuine site, the user will spot something fishy (sorry!) because either there is no way to logon using CardSpace or, if there is, the user will be warned 1) that it's the first time they've visited the site (CardSpace keeps track of where cards are used), and 2) that it isn't an HA cert -&amp;nbsp;provided the HA cert verification mechanism is working as intended, that is.&lt;/P&gt;
&lt;P&gt;We will be adding an HA cert to the sandbox in future so you will be able to test the HA cert behaviour as well.&lt;/P&gt;&lt;/DIV&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=669024" width="1" height="1"&gt;</content><author><name>nigelwa</name><uri>http://blogs.msdn.com/nigelwa/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Using MetadataResolver with Windows CardSpace and WCF - June CTP edition</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/archive/2006/06/16/634874.aspx" /><id>http://blogs.msdn.com/b/nigelwa/archive/2006/06/16/634874.aspx</id><published>2006-06-17T04:15:00Z</published><updated>2006-06-17T04:15:00Z</updated><content type="html">&lt;P&gt;Since&amp;nbsp;the .NET Framework 3.0 June CTP&amp;nbsp;should&amp;nbsp;soon be upon us here is the&amp;nbsp;updated version of the&amp;nbsp;MetadataResolver code I gave in the &lt;A href="http://blogs.msdn.com/nigelwa/archive/2006/06/14/631672.aspx"&gt;last post&lt;/A&gt;. You'll see that it's a bit more&amp;nbsp;concise and there is no longer a separate InfoCardClientCredentials class. &lt;/P&gt;
&lt;P&gt;One thing to be aware of when you build a service with post-beta 2 bits is that mex is no longer on by default so you'll need an additional service endpoint for this code to actually be able to pull down mex from you WCF service:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;&amp;lt;endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;I won't put&amp;nbsp;all the code&amp;nbsp;here but&amp;nbsp;we'll be updating our code samples at &lt;A href="http://wcs.netfx3.com"&gt;http://wcs.netfx3.com&lt;/A&gt; when the June CTP hits the streets. You&amp;nbsp;should also keep an eye out for some new features on the site to&amp;nbsp;celebrate this build!&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;using System;&lt;BR&gt;using System.ServiceModel;&lt;BR&gt;using System.ServiceModel.Channels;&lt;BR&gt;using System.ServiceModel.Description;&lt;BR&gt;using System.IdentityModel.Selectors;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;namespace HelloClient&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Press &amp;lt;Enter&amp;gt; when service is ready");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uri mexUri = new Uri("&lt;A href="http://localhost:4124/helloService/mex"&gt;http://localhost:4124/helloService/mex&lt;/A&gt;");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContractDescription contract = ContractDescription.GetContract(typeof(HelloService.IHello));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EndpointAddress mexEndpointAddress = new EndpointAddress(mexUri);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contract.ContractType, mexEndpointAddress);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (ServiceEndpoint endpoint in endpoints)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (endpoint.Contract.Namespace.Equals(contract.Namespace) &amp;amp;&amp;amp; endpoint.Contract.Name.Equals(contract.Name))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ChannelFactory&amp;lt;HelloService.IHello&amp;gt; cf = new ChannelFactory&amp;lt;HelloService.IHello&amp;gt;(endpoint.Binding, endpoint.Address);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cf.Credentials.ServiceCertificate.Authentication.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HelloService.IHello chn = cf.CreateChannel();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(chn.Say());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cf.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (UserCancellationException)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("User cancelled");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (UntrustedRecipientException)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("User does not trust the recipient");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (ServiceNotStartedException)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("CardSpace service not started");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (InfoCardException ice)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Generic CardSpace exception :" + ice.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Other exceptions :" + e.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Press any key to finish");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadKey();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=634874" width="1" height="1"&gt;</content><author><name>nigelwa</name><uri>http://blogs.msdn.com/nigelwa/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Using MetadataResolver with Windows CardSpace and WCF</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/archive/2006/06/14/631672.aspx" /><id>http://blogs.msdn.com/b/nigelwa/archive/2006/06/14/631672.aspx</id><published>2006-06-15T03:15:00Z</published><updated>2006-06-15T03:15:00Z</updated><content type="html">&lt;P&gt;If you want to use CardSpace from a WCF client &lt;STRONG&gt;without hard-coding&amp;nbsp;config or using an App.config &lt;/STRONG&gt;file&amp;nbsp;then try using the MetadataResolver class. Here is some code that works with .NET Framework 3.0 Beta 2 ("WinFX"):&lt;/P&gt;
&lt;P&gt;I've been meaning to get&amp;nbsp;a MetadataResolver example&amp;nbsp;working for a while&amp;nbsp;and&amp;nbsp;I was finally able to spend some time today with it. Not too&amp;nbsp;difficult although it's due to change a little bit with the June CTP. The revocation check was necessary to get around&amp;nbsp;my certificate CRL being unavailable. &lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;using System;&lt;BR&gt;using System.ServiceModel;&lt;BR&gt;using System.ServiceModel.Channels;&lt;BR&gt;using System.ServiceModel.Description;&lt;BR&gt;using System.IdentityModel.Selectors;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;namespace HelloClient&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uri mexUri = new Uri("&lt;/FONT&gt;&lt;A href="http://localhost:4123/helloService/mex"&gt;&lt;FONT face=Verdana size=1&gt;http://localhost:4123/helloService/mex&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=1&gt;");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EndpointAddress mexEndpointAddress = new EndpointAddress(mexUri);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceEndpointCollection endpoints = MetadataResolver.Resolve(mexEndpointAddress);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContractDescription contract = ContractDescription.GetContract(typeof(HelloService.IHello));&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (ServiceEndpoint endpoint in endpoints)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (endpoint.Contract.Namespace.Equals(contract.Namespace) &amp;amp;&amp;amp; endpoint.Contract.Name.Equals(contract.Name))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ChannelFactory&amp;lt;HelloService.IHello&amp;gt; cf =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new ChannelFactory&amp;lt;HelloService.IHello&amp;gt;(endpoint.Binding, endpoint.Address);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfoCardClientCredentials credentials = new InfoCardClientCredentials();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; credentials.ServiceCertificate.Authentication.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cf.Endpoint.Behaviors.Add(credentials);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HelloService.IHello chn = cf.CreateChannel();&lt;/FONT&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(chn.Say());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cf.Close();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (UserCancellationException)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("User cancelled");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (UntrustedRecipientException)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("User does not trust the recipient");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (ServiceNotStartedException)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("CardSpace service not started");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (InfoCardException ice)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Generic&amp;nbsp;CardSpace exception :" + ice.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Other exceptions :" + e.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Press any key to finish");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadKey();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT face=Verdana size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=631672" width="1" height="1"&gt;</content><author><name>nigelwa</name><uri>http://blogs.msdn.com/nigelwa/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Least privileged user access for developers</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/archive/2005/07/29/445155.aspx" /><id>http://blogs.msdn.com/b/nigelwa/archive/2005/07/29/445155.aspx</id><published>2005-07-30T00:12:00Z</published><updated>2005-07-30T00:12:00Z</updated><content type="html">&lt;P&gt;OK, the last entry was a teaser for a blog entry or two on what developers can and IMHO should do regarding least privilege and least privileged user access (LUA) on Windows. A lot of this information can be already found scattered around but I wanted to target developers specifically and also&amp;nbsp;be reasonably concise with links to furhter information.&lt;/P&gt;
&lt;P&gt;Principle of Least Privilege (from &lt;A href="http://www.microsoft.com/mspress/books/5957.asp"&gt;&lt;EM&gt;Writing Secure Code&lt;/EM&gt;&lt;/A&gt;): &lt;EM&gt;“All apps should execute with the least privilege to get the job done and no more” &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The idea of least privilege is to limit the damage done by accident, error or attack. It’s quite simple: the more privileges a process has the more havoc it can wreak on your machine. &lt;/P&gt;
&lt;P&gt;During &lt;A href="http://www.sysinternals.com/blog/"&gt;Mark Russinovich&lt;/A&gt;’s entertaining and insightful malware talk at TechEd EMEA he admitted to accidentally downloading some spyware (which proved remarkably obstinate to remove). When Mark asked the audience who personally had been infected by malware, almost the entire room (~700 people) raised their hand. I have to admit I was surprised. If someone as smart as Mark Russinovich gets infected then what hope is there for the rest of us? The numbers in the room provided ample evidence: not a lot!&lt;/P&gt;
&lt;P&gt;Given that we all make mistakes, all software has bugs, and that there is no shortage of hackers and malware, we’d be foolish not to apply the principle of least privilege to our PCs and to our code, right? What’s more, if we can do this with little or no inconvenience to either ourselves or our users then we’d have to be truly barking mad not to do something.&lt;/P&gt;
&lt;P&gt;I am talking about developers here, not sysadmins, not knowledge workers (anyone else detest that term?), not home users. Developers are – of course – special and need special powers. They are continually installing tools and software, modifying registry entries, debugging, playing with COM and web apps and doing other fun stuff. What’s more, they have not only themselves to consider but also their software – and their users. Developers have the reputation of being anti-social but sandals and unwashed armpits and are nowhere near as offensive in my eyes as software which insists on running as SYSTEM when it doesn’t need to!&lt;/P&gt;
&lt;P&gt;Let’s cover personal computer hygiene first and tackle code later. Here are the main choices, each making a different trade-off between security and usability:&lt;/P&gt;
&lt;P&gt;The Developer as User choices&lt;BR&gt;1)&amp;nbsp;Log in as admin&lt;BR&gt;2)&amp;nbsp;Log in as admin but do risky things as LUA&lt;BR&gt;3)&amp;nbsp;Log in as LUA with a few extra privileges for added comfort&lt;BR&gt;4)&amp;nbsp;Login as LUA and escalate privileges when required&lt;BR&gt;5)&amp;nbsp;Login as LUA and stay there&lt;/P&gt;
&lt;P&gt;Personally, I believe option 1 is indefensible and option 5 is impractical – at least until &lt;A href="http://www.microsoft.com/windowsvista/default.mspx"&gt;Windows Vista&lt;/A&gt; (née Longhorn)ships, where even admins log in as normal users – so let’s take a look at the other three.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Logging in as admin but doing risky things as LUA&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The purists will pour scorn on this technique but given the large number of developers who admit to running as admin this can benefit a lot of people for minimal effort. You may resist all attempts to convert you to a non-admin logon but there’s really no excuse for not adopting this simple method of reducing risk, especially when you consider that much of today’s malware (rightly) assumes it will be running in an admin context and promptly fails otherwise.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;You log in (as usual) as admin on your XP or W2K3 box but when it comes to running a browser, email, IM or any other app you deem risky, you cut the privileges using Software Restriction Policy (aka SRP or SAFER). There are two ways to do this: &lt;/P&gt;
&lt;P&gt;1)&amp;nbsp;You use a simple program which crufts up a restricted token using the SAFER APIs and then launches your chosen app using that token, or&lt;BR&gt;2)&amp;nbsp;You take the phone off the hook, put your feet on the desk and make like a sysadmin, running secpol.msc and using group policy&lt;/P&gt;
&lt;P&gt;These approaches are documented by &lt;a href="http://blogs.msdn.com/michael_howard/"&gt;Michael Howard&lt;/A&gt; in &lt;EM&gt;Browsing the Web and Reading E-mail Safely as an Administrator&lt;/EM&gt;, &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure11152004.asp"&gt;Part 1&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure01182005.asp"&gt;Part 2&lt;/A&gt; respectively.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure11152004.asp"&gt;Part 1&lt;/A&gt; has a simple app, DropMyRights, which you &lt;A href="http://download.microsoft.com/download/f/2/e/f2e49491-efde-4bca-9057-adc89c476ed4/DropMyRights.msi"&gt;download&lt;/A&gt;, and then use as follows&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;DropMyRights {application path} [N|C|U]&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;N runs the app as a normal user&lt;BR&gt;C runs the app as a constrained user (less rights than N)&lt;BR&gt;U runs the app as an untrusted user (less rights than C)&lt;/P&gt;
&lt;P&gt;N is the recommended setting and usually works. I find C sometimes works but U rarely does (eg. notepad doesn’t lauch!). Your mileage may vary depending on the apps you use so experiment and see what is best for you.&lt;/P&gt;
&lt;P&gt;The obvious thing to do with DropMyRights is to set up some shortcuts for IE, IM and Outlook with a target such as&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;DropMyRights "c:\program files\internet explorer\iexplore.exe" N&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;To make it pretty, add a name like “IE (nonadmin)”, start the thing minimized and select an icon which entices you to click on it. Once you’ve replaced your old shortcuts with the shiny new ones you need never give it another thought. You are no longer running your risky apps as admin. &lt;/P&gt;
&lt;P&gt;At this point, if you are a cynical old goat like me, then you will want to check that DropYourRights is doing what it says on the tin. To do this, &lt;A href="http://www.sysinternals.com/Utilities/ProcessExplorer.html"&gt;download&lt;/A&gt; Process Explorer from Sysinternals.com and check it out: in the tool, double click the relevant process and in the Security tab you should see (at least) a Deny flag on the Administrators group and additional constraints for the C and U options.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure01182005.asp"&gt;Part 2&lt;/A&gt; uses a magical DWORD registry key, &lt;FONT face="Courier New"&gt;Levels&lt;/FONT&gt;, set to &lt;FONT face="Courier New" color=#000000&gt;0x20000&lt;/FONT&gt; under&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;Once you have added this, you can run secpol.msc, go to “Software Restriction Policies” (it may ask you to create them via the action menu) and you will notice “Basic User” under Security Levels. You are then able to go to “Additional Rules” and add a new path rule, forcing an app to run as Basic User. &lt;/P&gt;
&lt;P&gt;The advantage to this approach is that all shortcuts to that target path will launch as Basic User. Note you can use group policy to disallow certain apps from running. This can be extremely useful if there are certain pieces of software you don’t want running on your machine.&lt;/P&gt;
&lt;P&gt;The ever-helpful kiwi, Michael Howard, provides an app, SetSAFER, which you can &lt;A href="http://download.microsoft.com/download/2/3/c/23ca1157-91df-422e-9d17-0bf970772331/SetSAFER.msi"&gt;download &lt;/A&gt;and compile against a version of Visual Studio 2005. I’ve tried it with beta 2 and it works perfectly. SetSAFER provides a simple UI and an XML config file allowing you to avoid secpol.msc and manipulate the registry directly.&lt;/P&gt;
&lt;P&gt;The observant amongst you may notice that when you add the Levels registry key some extra options appear for runas, namely /showtrustlevels and /trustlevel. This enables you to do the following:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;runas /trustlevel:"Basic User" "c:\program files\internet explorer\iexplore.exe"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;However, I’ve not had as much success with this (i.e. IE hangs) and I would advise you to use the other methods. This is a timely reminder that until the MSDN articles were published much of this stuff was undocumented so, as always, be careful. &lt;/P&gt;
&lt;P&gt;Also please bear in mind the weaknesses of this whole approach (logging in as admin and running risky apps as least privilege). Malware running as LUA could send Windows messages to other apps running with higher privilege. However, you are raising the bar for the malware writers and contributing to a strategy of defense in depth.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Logging in as LUA but adding a few extra privileges&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;With this approach you make your everyday account a member of the Users group and then customize it by adding privileges that you need. You do this by running secpol.msc and going to Local Policies -&amp;gt; User Rights Assignment. You could, for example, give yourself the powerful SeSystemtimePrivilege which enables you to see a calendar by double clicking the clock in the toolbar (oops, I’m in danger of breaking the old journalist’s rule: never use sarcasm in writing). Actually, there is some method in the madness: you might not want end users to change the time on their machine as they could subvert auditing.&lt;/P&gt;
&lt;P&gt;Personally, I don’t like this approach. Micromanaging your privileges is a labour-intensive PITA. The operating system is supposed to provide abstractions to avoid this kind of crap. Anyway, if you can keep the number of extra privileges low and it works for you then more power to you - but always remember that malware running as you can do everything you can.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Logging in as LUA and escalating privileges when required&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This is the preferred approach from the LUA purists. You log on as a normal user (i.e. your user account is in the Users group not the administrators group) but when you need to you escalate your privileges. Ideally you should take only those privileges you need and relinquish them as soon as possible but to avoid faffing it is normal to escalate to admin and back again. There are a number of ways you can do this: using the secondary logon service (Runas/MakeMeAdmin), Terminal Services/Remote Desktop and Fast User Switching. &lt;/P&gt;
&lt;P&gt;You’ve probably noticed that when you give yourself new privileges the changes don’t manifest themselves until the next logon. As the name implies, the secondary logon service (check it out in your list of services) enables you to start a process under alternate credentials using the runas command. It also pops up as the runas option in context menus and in the &lt;FONT face="Courier New"&gt;CreateProcessWithLogonW &lt;/FONT&gt;API.&lt;/P&gt;
&lt;P&gt;At its simplest, you can do something like&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;runas /u:machinename\administrator cmd&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;and, after being prompted for a password, a command prompt will pop up running as admin (helpfully labeled as such on my XPSP2 box). Or you can get fancy with&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;runas /u:machinename\administrator "runas /netonly /u:domainname\username \"%comspec% /K""&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;I’ve had success with Keith Brown’s approach of having a red-coloured admin command prompt running with my domain credentials for network connections (see &lt;A href="http://www.pluralsight.com/keith/book/html/howto_runasnonadmin.html"&gt;here&lt;/A&gt; for details). You can use it to launch Control Panel applets, run mmc, and install apps (see &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/tchDevelopingSoftwareInVisualStudioNETWithNon-AdministrativePrivileges.asp"&gt;here&lt;/A&gt; for a list of applets and mmc files). This is a nice approach if you enjoy working in command windows. &lt;/P&gt;
&lt;P&gt;I like an easy life so I tend to just set up some shortcuts for apps that need to run as admin with the runas flag on. Then when I double click on the shortcut I automatically get prompted to see whether I want to use alternate credentials. To enable this you just need to click the advanced button on a shortcut’s properties context menu and select “Run with different credentials”. By the way, the “Protect my computer and data from unauthorized program activity” option in XP runs the app with a restricted SID, somewhat similar to the C option on DropMyRights.&lt;/P&gt;
&lt;P&gt;The disadvantages to the secondary logon approach are that malware can send Windows messages to the admin command prompt window (think Sendkeys). Also if you install an app that is so brain-dead that it takes user information at install time rather than at run time then you end up with your admin profile rather than your user profile. &lt;/P&gt;
&lt;P&gt;Another thing to watch out for is programs that, once running, resist all attempts to launch additional instances of themselves. By default, if you try to run another instance of Explorer it laughs in your face and instead opens a new window from the existing process. Unfortunately, this prevents you from launching a separate instance of Explorer running as admin. This issue, with workarounds, is covered in more detail in Aaron’s Margosis’ blog &lt;a href="http://blogs.msdn.com/aaron_margosis/archive/2004/07/07/175488.aspx"&gt;here&lt;/A&gt;. The easiest thing to do is to launch IE instead although there are some refresh issues.&lt;/P&gt;
&lt;P&gt;Aaron has evolved Keith Brown’s humble batch file to a minor art form in the shape of &lt;A href="http://www.speakeasy.net/~aaronmar/NonAdmin/MakeMeAdmin.zip"&gt;MakeMeAdmin&lt;/A&gt;. Rather than bring up a command prompt running as admin, MakeMeAdmin leaps through some hoops to add your user account to the administrators group and launch a command prompt using those credentials – before promptly removing you from the admins group again. You can read the details &lt;a href="http://blogs.msdn.com/aaron_margosis/archive/2004/07/24/193721.aspx"&gt;here &lt;/A&gt;and &lt;a href="http://blogs.msdn.com/aaron_margosis/archive/2005/03/11/394244.aspx"&gt;here&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;The advantage of this approach is that the high privilege command window is running as you with administrator privileges. Brain-dead install programs pick up your profile correctly. Any objects you create will be marked either with your SID or the Administrators SID depending on the “Default Owner” setting which Aaron describes in detail &lt;a href="http://blogs.msdn.com/aaron_margosis/archive/2005/03/11/394244.aspx"&gt;here&lt;/A&gt;. Read this carefully to understand the ownership issues. The general disadvantage with MakeMeAdmin is again the possibility of a SendKeys attack.&lt;/P&gt;
&lt;P&gt;The solution to this mixed desktop context issue is to either use a Remote Desktop to yourself (!) on Windows Server or to use Fast User Switching (FUS) on Windows XP. Both of these use Terminal Services technology to provide a separate desktop and you can switch between them as required. &lt;/P&gt;
&lt;P&gt;Unfortunately, most developers’ main machine is not running W2K3 and you can only use Fast User Switching if you are not connected to a domain (there is also no offline folder support with FUS). This rules out a lot of us. Naturally, Windows Vista fixes this but in the meantime, FUS is incredibly useful for your home PC(s) where you can set up a separate admin account for games (which often need admin access) and low privilege accounts for browsing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Using Visual Studio when logged as LUA&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Versions of Visual Studio prior to VS 2005 can be painful to use as a non-admin – which is a shame seeing as most of the time you are just typing code. There is an &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/tchDevelopingSoftwareInVisualStudioNETWithNon-AdministrativePrivileges.asp"&gt;MSDN article &lt;/A&gt;on how to work around all the issues. From a pragmatic point of view, if you can run as Visual Studio as LUA then fantastic but if you can’t then it’s still better to log in as a non-admin and set up a shortcut with VS running as admin than to log in as admin from the start.&lt;/P&gt;
&lt;P&gt;This is probably as good a place as any to ask a question about privileges: is the cunningly named SeDebugPrivilege necessary in order to debug? The answer, perhaps surprisingly, is not in the majority of cases. By default, you can debug any process running as the currently logged in user. The time you need SeDebugPrivilege is when you have to debug a process running as another user. This normally happens when you want to debug a server process which, more often than not, is with an IIS web app. &lt;/P&gt;
&lt;P&gt;So if you’re just hitting F5 in Visual Studio there shouldn’t be a problem. You will need to be in the “Debugger users” group for Visual Studio 2003 but this is a VS03 thing not a Windows thing. This group is created when VS is installed and allows access to the Visual Studio Machine Debug Manager component. &lt;/P&gt;
&lt;P&gt;Note things are a bit different in Visual Studio 2005 – there is no Debugger users group (nor the VS Developers group for creating web sites) and the whole LUA experience is much, much better.&lt;/P&gt;
&lt;P&gt;Well, when I’ve recovered from writing this post I’ll try another post talking about writing code that runs as least privilege. In fact, this is much more important than you personally logging in as admin. How you write your code can affect the experience and the security of many people and, what’s more, they are your customers. Be nice to them.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Some resources&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;1)&amp;nbsp;Keith Brown’s &lt;A href="http://pluralsight.com/wiki/default.aspx/Keith.GuideBook.HomePage"&gt;.NET Developer’s Guide to Windows Security&lt;/A&gt;&lt;BR&gt;2)&amp;nbsp;Aaron Margosis’ &lt;a href="http://blogs.msdn.com/aaron_margosis/"&gt;blog&lt;/A&gt;&lt;BR&gt;3)&amp;nbsp;&lt;a href="http://blogs.msdn.com/ptorr/archive/2003/09/21/56188.aspx"&gt;Peter Torr on non-admin&lt;/A&gt;&lt;BR&gt;4)&amp;nbsp;&lt;a href="http://blogs.msdn.com/larryosterman/archive/2004/09/22/232938.aspx"&gt;Larry Osterman on non-admin&lt;/A&gt;&lt;BR&gt;5)&amp;nbsp;&lt;A href="http://nonadmin.editme.com/"&gt;Non-Admin Wiki&lt;/A&gt;&lt;BR&gt;6)&amp;nbsp;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/leastprivlh.asp"&gt;Least Privilege in Longhorn&lt;/A&gt; &lt;BR&gt;7)&amp;nbsp;&lt;A href="http://pluralsight.com/wiki/default.aspx/Keith.GuideBook/HowToDevelopCodeAsANonAdmin.html"&gt;How to develop code as a Non-Admin&lt;/A&gt; &lt;BR&gt;8)&amp;nbsp;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure06112002.asp"&gt;The Challenge of Least Privilege&lt;/A&gt;&lt;BR&gt;9)&amp;nbsp;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure11152004.asp"&gt;Browsing the Web and Reading E-mail Safely as an Administrator (Part 1)&lt;/A&gt; &lt;BR&gt;10)&amp;nbsp;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure01182005.asp"&gt;Browsing the Web and Reading E-mail Safely as an Administrator (Part 2)&lt;/A&gt;&amp;nbsp; &lt;BR&gt;11)&amp;nbsp;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/tchDevelopingSoftwareInVisualStudioNETWithNon-AdministrativePrivileges.asp"&gt;Developing Software in Visual Studio .NET with Non-Administrative Privileges&lt;/A&gt;&lt;BR&gt;12)&amp;nbsp;&lt;A href="http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/rstrplcy.mspx"&gt;Using Software Restriction Policies to Protect Against Unauthorized Software&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=445155" width="1" height="1"&gt;</content><author><name>nigelwa</name><uri>http://blogs.msdn.com/nigelwa/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Least Privilege Questionnaire</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/archive/2005/07/13/438602.aspx" /><id>http://blogs.msdn.com/b/nigelwa/archive/2005/07/13/438602.aspx</id><published>2005-07-13T23:26:00Z</published><updated>2005-07-13T23:26:00Z</updated><content type="html">&lt;P&gt;For&amp;nbsp;how many of the following questions can you answer "no"?&lt;/P&gt;
&lt;P&gt;1) Your PC is connected to the Internet&lt;BR&gt;2) You have valuable things on your PC and it is probably joined to a corporate LAN&lt;BR&gt;3) There are nasty people on the Internet who would like nothing more than to gain access to your PC and to your network&lt;BR&gt;4) There are undiscovered vulnerabilities in the software running on your PC…&lt;BR&gt;5) … that could be exploited by a hacker or by malware&lt;BR&gt;7) Your anti-virus software is reactive and imperfect&lt;BR&gt;8) You (sometimes) make mistakes: clicking yes when you mean no, downloading software you shouldn’t, opening email or IM you shouldn’t &lt;BR&gt;9) There are webpages with “drive-by” installations of malware: you render a page in your browser and you're infected (and unaware of it)&lt;BR&gt;10) You log on as an admin: a successful attacker or malware will have complete and utter control of your PC&lt;BR&gt;11) You're a developer, you know about all of the above and you &lt;EM&gt;still&lt;/EM&gt; log on as admin&lt;BR&gt;12) Oh, and you have a weak password&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=438602" width="1" height="1"&gt;</content><author><name>nigelwa</name><uri>http://blogs.msdn.com/nigelwa/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>64 bits should be plenty enough for anybody</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nigelwa/archive/2005/05/04/414756.aspx" /><id>http://blogs.msdn.com/b/nigelwa/archive/2005/05/04/414756.aspx</id><published>2005-05-05T01:17:00Z</published><updated>2005-05-05T01:17:00Z</updated><content type="html">&lt;P&gt;Bill Gates once remarked “640KB of memory should be plenty enough for anybody”. Actually, I have it on good authority that he didn't say it, but let's not let that get in the way of a good story. The reason the quote has stuck is that firstly, it was a pretty plausible thing to say at the time he (allegedly) said it and, of course, it's fun to see smart people getting predictions spectacularly wrong! The same thing happened to Thomas J Watson with his famous 1943&amp;nbsp;effort "I think there is a world market for maybe five computers". Or am I getting confused with the Professor in&amp;nbsp;the time travel&amp;nbsp;Simpsons episode...?&lt;/P&gt;
&lt;P&gt;The common theme is a tendency to underestimate the power and ubiquity of computers in the future. Experience teaches us that we keep on requiring bigger and better hardware. Thank you Mr Moore! [An oracle if ever there was one.]&lt;/P&gt;
&lt;P&gt;Recently I saw an email giving the number of x64 computers in use in Mircosoft in Redmond. I had no idea they were so abundant. I believe Gartner has been recommending 64-bit purchases for corporate customers, the local computer stores are full of 'em, and admittedly Microsoft is full of techies who like nothing better than to get their hands on some cool new hardware but even so, I was still taken aback.&lt;/P&gt;
&lt;P&gt;64-bit has been on my back burner of things to look at but with the release of XP x64, it seems clear to me that 64-bit Windows is on the verge of becoming a mainstream, pervasive technology - on the desktop&amp;nbsp;and the server. The time for me to get hold of an x64 machine and check out the 64-bit version of the .NET Framework has arrived. If you're an ISV then it's probably a good idea for you to do the same.&amp;nbsp;&lt;a href="https://blogs.msdn.com:443/volkerw"&gt;Volker's blog&lt;/A&gt; is the one to watch for info on 64-bit Windows. It was there I &lt;a href="https://blogs.msdn.com:443/volkerw/archive/2005/05/02/413980.aspx"&gt;learned&lt;/A&gt; that Intel have just started shipping their &lt;EM&gt;last&lt;/EM&gt; 32-bit only processor!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=414756" width="1" height="1"&gt;</content><author><name>nigelwa</name><uri>http://blogs.msdn.com/nigelwa/ProfileUrlRedirect.ashx</uri></author></entry></feed>