<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Enterprise IT Identity &amp; Access Management : 6. SampleCode</title><link>http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx</link><description>Tags: 6. SampleCode</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Sample Code (VBScript) - Retrieve MIIS WMI Password History</title><link>http://blogs.technet.com/yaleli/archive/2006/04/10/424859.aspx</link><pubDate>Tue, 11 Apr 2006 00:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:424859</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/424859.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=424859</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=424859</wfw:comment><description>&lt;P&gt;This is a sample&amp;nbsp;WMI script&amp;nbsp;to retrieve password change history for a specific account through MIIS. You just need to run it on MIIS server&amp;nbsp;with MA name, domain name and account name as parameters.&lt;/P&gt;
&lt;P&gt;Option Explicit&lt;/P&gt;
&lt;P&gt;On Error Resume Next&lt;/P&gt;
&lt;P&gt;Dim Service&lt;BR&gt;Dim CsObjects&lt;BR&gt;Dim CsObject&lt;BR&gt;Dim Arguments&lt;BR&gt;Dim domainName&lt;BR&gt;Dim ma&lt;BR&gt;Dim account&lt;BR&gt;Dim MVGuid&lt;BR&gt;Dim password&lt;BR&gt;Dim oldPassword&lt;BR&gt;Dim r&lt;/P&gt;
&lt;P&gt;Set Arguments = WScript.Arguments.Named&lt;/P&gt;
&lt;P&gt;domainName = Arguments.Item("D")&lt;BR&gt;account = Arguments.Item("A")&lt;BR&gt;ma = Arguments.Item("M")&lt;/P&gt;
&lt;P&gt;Set Service = GetObject("winmgmts:root\MicrosoftIdentityIntegrationServer")&lt;BR&gt;Set CsObjects = Service.ExecQuery("Select * from MIIS_CSObject where domain='" + domainName + "' and account='" + account + "'")&lt;/P&gt;
&lt;P&gt;For each CsObject in CsObjects&lt;BR&gt;&amp;nbsp;&amp;nbsp; MVGuid = CsObject.MVGuid&lt;BR&gt;Next&lt;/P&gt;
&lt;P&gt;Set CsObjects = Service.ExecQuery("Select * from MIIS_CSObject where mvguid='" + MVGuid&amp;nbsp; + "'")&lt;/P&gt;
&lt;P&gt;For each CsObject in CsObjects&lt;BR&gt;&amp;nbsp;&amp;nbsp; if LCase(CsObject.MAName) = LCase(ma) then&lt;BR&gt;&amp;nbsp;wscript.echo "Retrieving MIIS WMI Password History ..."&lt;BR&gt;&amp;nbsp;wscript.Echo CsObject.PasswordChangeHistory&lt;BR&gt;&amp;nbsp;&amp;nbsp; end if&lt;BR&gt;Next&lt;/P&gt;
&lt;P&gt;Sub ErrorHandler (ErrorMessage)&lt;BR&gt;&amp;nbsp; WScript.Echo ErrorMessage&lt;BR&gt;&amp;nbsp; WScript.Quit(1)&lt;BR&gt;End Sub &lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=424859" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item><item><title>Sample Code (VBScript) - Query CAPICOM</title><link>http://blogs.technet.com/yaleli/archive/2006/03/29/423581.aspx</link><pubDate>Thu, 30 Mar 2006 00:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:423581</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/423581.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=423581</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=423581</wfw:comment><description>&lt;P&gt;This script queries capicom com object to get cert expiration date. Capicom.dll must be installed and registered in order to run this script. If you need&amp;nbsp;additional cert info, you can just add more CAPICOM Cert object properties to my sample code.&lt;/P&gt;
&lt;P&gt;Option Explicit&lt;BR&gt;on error resume next&lt;BR&gt;Const CAPICOM_MY_STORE = "My"&lt;BR&gt;Const CAPICOM_LOCAL_MACHINE_STORE&amp;nbsp; = 1&lt;BR&gt;Const CAPICOM_CURRENT_USER_STORE&amp;nbsp; = 2&lt;BR&gt;Const CAPICOM_STORE_OPEN_READ_ONLY = 0&lt;BR&gt;Const CAPICOM_EKU_CLIENT_AUTH = 2&lt;BR&gt;Const CAPICOM_EKU_CODE_SIGNING = 3&lt;BR&gt;Const CAPICOM_EKU_EMAIL_PROTECTION = 4&lt;BR&gt;Const CAPICOM_EKU_SERVER_AUTH = 1&lt;BR&gt;Const CAPICOM_EKU_OTHER = 0&lt;BR&gt;Const CR_DISP_ISSUED&amp;nbsp; = &amp;amp;H3&lt;BR&gt;Const CR_OUT_CHAIN = &amp;amp;H100&lt;BR&gt;Const CR_OUT_BASE64 = &amp;amp;H1&lt;BR&gt;Const CERT_SYSTEM_STORE_LOCAL_MACHINE = &amp;amp;H20000&lt;BR&gt;Const CR_IN_BASE64&amp;nbsp; = &amp;amp;H1&lt;BR&gt;Const CR_IN_PKCS10&amp;nbsp; = &amp;amp;H100&lt;/P&gt;
&lt;P&gt;Dim Wshshell, Wshfile, oCert, oStore, return, certname, validto, expirationdate, computername, systemroot, cn, sn&lt;BR&gt;Set Wshshell = CreateObject("Wscript.shell")&lt;BR&gt;Set Wshfile = CreateObject("Scripting.FileSystemObject")&lt;BR&gt;computername = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")&lt;BR&gt;systemroot = WshShell.ExpandEnvironmentStrings("%SYSTEMROOT%")&lt;BR&gt;&lt;BR&gt;REM *** Query cert Store and Update new server records ***&lt;BR&gt;Set oStore = CreateObject ("CAPICOM.Store")&lt;BR&gt;oStore.Open CAPICOM_LOCAL_MACHINE_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY&lt;BR&gt;&lt;BR&gt;For Each oCert in oStore.Certificates&lt;BR&gt;&amp;nbsp;cn = Split(oCert.SubjectName,",")&lt;BR&gt;&amp;nbsp;sn = Split(cn(0),"=")&lt;BR&gt;&amp;nbsp;certname = sn(1)&lt;BR&gt;&amp;nbsp;validto = Split(oCert.ValidToDate," ")&lt;BR&gt;&amp;nbsp;expirationdate = validto(0)&lt;BR&gt;&amp;nbsp;WScript.Echo "&amp;nbsp; server name: " &amp;amp; computername&lt;BR&gt;&amp;nbsp;WScript.Echo "&amp;nbsp; certname: " &amp;amp; certname&lt;BR&gt;&amp;nbsp;WScript.Echo "&amp;nbsp; Valid To: " &amp;amp; expirationdate&lt;BR&gt;End If&amp;nbsp;&lt;BR&gt;Next&lt;/P&gt;
&lt;P&gt;REM *** Completion and Cleanup&lt;BR&gt;Set Wshshell = nothing&lt;BR&gt;Set Wshfile = nothing&lt;BR&gt;Set oStore = nothing&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=423581" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item><item><title>Sample Code (VBScript) - Compare Two AD Groups and Get Membership Difference</title><link>http://blogs.technet.com/yaleli/archive/2006/03/26/422256.aspx</link><pubDate>Sun, 26 Mar 2006 08:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:422256</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/422256.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=422256</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=422256</wfw:comment><description>&lt;P&gt;&lt;FONT color=#000080&gt;If you want two AD groups with the same membership but are afraid of mis-sync, I have a sample script to find the delta:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;On Error Resume Next&lt;BR&gt;Dim strGroup1, strGroup2, iArgs, oArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;iArgs = Wscript.arguments.count&lt;BR&gt;Set oArgs = Wscript.arguments&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;strGroup1 = "cn=" &amp;amp; oArgs(0) &amp;amp; ",ou=ou_name,dc=child_domain_name,dc=parent_domain_name,dc=c0m"&lt;BR&gt;strGroup2 = "cn=" &amp;amp; oArgs(1) &amp;amp; ",ou=ou_name,dc=child_domain_name,dc=parent_domain_name,dc=c0m"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Set objGroup1 = GetObject("LDAP://" &amp;amp; strGroup1)&lt;BR&gt;objGroup1.GetInfo&lt;BR&gt;arrMemberOf1 = objGroup1.GetEx("member")&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Set objGroup2 = GetObject("LDAP://" &amp;amp; strGroup2)&lt;BR&gt;objGroup2.GetInfo&lt;BR&gt;arrMemberOf2 = objGroup2.GetEx("member")&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;WScript.Echo oArgs(0) &amp;amp; " Members not in " &amp;amp; oArgs(1)&lt;BR&gt;For Each strMember in arrMemberOf1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strUser1 = split(strMember,",")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (StrComp(InGroup2(strUser1(0)),"no") = 0) then &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strUser = split(strUser1(0),"=")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WScript.echo strUser(1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;BR&gt;Next&lt;BR&gt;WScript.Echo " "&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;WScript.Echo oArgs(1) &amp;amp; " Members not in " &amp;amp; oArgs(0)&lt;BR&gt;For Each strMember in arrMemberOf2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strUser2 = split(strMember,",")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (StrComp(InGroup1(strUser2(0)),"no") = 0) then &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strUser = split(strUser2(0),"=")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WScript.echo strUser(1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;BR&gt;Next&lt;BR&gt;WScript.Echo " "&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Function InGroup1(strMember2)&lt;BR&gt;InGroup1 = "no"&lt;BR&gt;For Each strMember in arrMemberOf1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strUser1 = split(strMember,",")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (StrComp(strMember2,strUser1(0)) = 0) then InGroup1 = "yes"&lt;BR&gt;Next&lt;BR&gt;' Wscript.Echo strMember2 &amp;amp; "&amp;nbsp; " &amp;amp; InGroup1&lt;BR&gt;End Function&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Function InGroup2(strMember1)&lt;BR&gt;InGroup2 = "no"&lt;BR&gt;For Each strMember in arrMemberOf2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strUser2 = split(strMember,",")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (StrComp(strMember1,strUser2(0)) = 0) then InGroup2 = "yes"&lt;BR&gt;Next&lt;BR&gt;' Wscript.Echo strMember1 &amp;amp; "&amp;nbsp; " &amp;amp; InGroup2&lt;BR&gt;End Function&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=422256" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item><item><title>Sample Code (C#) - Provision User Accounts and Groups with MIIS</title><link>http://blogs.technet.com/yaleli/archive/2006/03/26/422281.aspx</link><pubDate>Sun, 26 Mar 2006 06:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:422281</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/422281.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=422281</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=422281</wfw:comment><description>&lt;P&gt;&lt;FONT color=#000080&gt;Here is my sample code to provision AD use accounts and groups using MIIS MV Extension:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;// Use Visual Studio to build&lt;BR&gt;using System;&lt;BR&gt;using Microsoft.MetadirectoryServices;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;namespace Mms_Metaverse&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public class MVExtensionObject : IMVSynchronization&lt;BR&gt;&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;public MVExtensionObject()&lt;BR&gt;&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;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;void IMVSynchronization.Initialize ()&lt;BR&gt;&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;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;void IMVSynchronization.Terminate ()&lt;BR&gt;&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;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;void IMVSynchronization.Provision (MVEntry mventry)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConnectedMA ManagementAgent;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Connectors;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReferenceValue dn;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;string container;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp; rdn;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSEntry CSentry;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Get the ActiveDirectory Management Agent&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ManagementAgent = mventry.ConnectedMAs["AD_MA_Name"];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connectors = ManagementAgent.Connectors.Count;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(0 == Connectors)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (mventry.ObjectType == "person" ) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container = "OU=OU_Name,DC=Domain_Name,DC=com";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(mventry["cn"].IsPresent)&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;rdn = "CN=" + mventry["cn"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dn = ManagementAgent.EscapeDNComponent(rdn).Concat(container);&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;else&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;throw new UnexpectedDataException();&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;CSentry = ManagementAgent.Connectors.StartNewConnector("user");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry.DN = dn;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["unicodepwd"].Values.Add("Initial_Password");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["cn"].Value = mventry["cn"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["sAMAccountName"].Value = mventry["sAMAccountName"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["displayName"].Value = mventry["displayName"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["givenName"].Value = mventry["givenName"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["mail"].Value = mventry["mail"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["mailNickname"].Value = mventry["mailNickname"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["sn"].Value = mventry["sn"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["title"].Value = mventry["title"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["telephoneNumber"].Value = mventry["telephoneNumber"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["userAccountControl"].IntegerValue = 66080; // Enable the account&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry.CommitNewConnector();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (mventry.ObjectType == "group" )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container = "OU=OU_Name,DC=Domain_Name,DC=com";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(mventry["cn"].IsPresent)&lt;BR&gt;&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;rdn = "CN=" + mventry["cn"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dn = ManagementAgent.EscapeDNComponent(rdn).Concat(container);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&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;throw new UnexpectedDataException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry = ManagementAgent.Connectors.StartNewConnector("group");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry.DN = dn;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["cn"].Value = mventry["cn"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["sAMAccountName"].Value = mventry["sAMAccountName"].Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry["groupType"].IntegerValue = 8;&amp;nbsp;// you can change type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CSentry.CommitNewConnector();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool IMVSynchronization.ShouldDeleteFromMV (CSEntry csentry, MVEntry mventry)&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; throw new EntryPointNotImplementedException();&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;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=422281" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item><item><title>Sample Code (T-SQL) - Protecting Identity Data with SQL 2005 Data Encryption</title><link>http://blogs.technet.com/yaleli/archive/2006/03/26/422251.aspx</link><pubDate>Sun, 26 Mar 2006 05:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:422251</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/422251.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=422251</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=422251</wfw:comment><description>&lt;FONT color=#000080 size=2&gt;
&lt;P&gt;There are multiple ways to protect (encrypt) data with SQL 2005: either using certificate or password.&lt;/P&gt;
&lt;P&gt;Here is my code sample to use a password to&amp;nbsp;encrypt identity data (assuming the identity table name as tblIdentity_SmartCard table,&amp;nbsp;the identity data column as&amp;nbsp;Identiy_PIN,&amp;nbsp;and GUID as column with primary key):&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'replace_with_real_password'&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;CREATE ASYMMETRIC KEY asymPW1 WITH ALGORITHM = RSA_1024 ENCRYPTION by Password = 'Str0ngPa$$w0rd'&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;CREATE SYMMETRIC KEY symPW1 WITH ALGORITHM = DES&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;ENCRYPTION BY ASYMMETRIC KEY asymPW1&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;OPEN SYMMETRIC KEY symPW1 DECRYPTION BY ASYMMETRIC KEY asymPW1 WITH Password = 'Str0ngPa$$w0rd'&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Declare @keyGUID UNIQUEIDENTIFIER&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;SET @keyGUID = (Select key_guid from sys.symmetric_keys WHERE name = 'symPW1')&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Insert Into tblIdentity_SmartCard (Identiy_PIN) Values (EncryptByKey(@keyGUID, 'replace_with_PIN_data',1))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Select GUID, Identiy_PIN from tblIdentity_SmartCard &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Select GUID, Convert(varchar,DecryptByKey(Identiy_PIN, 1))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;from tblIdentity_SmartCard &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Close SYMMETRIC KEY symPW1&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=422251" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item><item><title>Sample Code (C++) - Scan Certificate Expiration Date Remotely</title><link>http://blogs.technet.com/yaleli/archive/2006/03/26/422253.aspx</link><pubDate>Sun, 26 Mar 2006 04:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:422253</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/422253.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=422253</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=422253</wfw:comment><description>&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;FONT color=#000080&gt;It is hard to find a tool to&amp;nbsp;check certificate expiration date on a remote machine without logon locally. Here is my code to accomplish this job:&lt;/FONT&gt; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;// to build: cl scancert.cpp -link crypt32.lib&lt;BR&gt;//------------------------------------------------------&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;#include &amp;lt;windows.h&amp;gt;&lt;BR&gt;#include &amp;lt;wincrypt.h&amp;gt;&lt;BR&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;BR&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR&gt;#include &amp;lt;shlwapi.h&amp;gt;&lt;BR&gt;const char *s1 = "&lt;A href="file://\\my"&gt;\\my&lt;/A&gt;";&lt;BR&gt;void listlocalcertstore(char const * const s);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;void main(int argc, char** argv)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; if (argc != 2) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Usage %s servername\n", argv[0]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; char *s2 = (char*)malloc( (strlen(s1) + strlen(argv[1]) +1) * sizeof(char));&lt;BR&gt;&amp;nbsp;&amp;nbsp; if( s2 == NULL) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Can not allocate memory on s2\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; strcpy(s2, argv[1]);&lt;BR&gt;&amp;nbsp;&amp;nbsp; strcat (s2, s1);&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp; char *s0 = (char*)malloc( (3 + strlen(s2)) * sizeof(char));&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp; if( s0 == NULL) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Can not allocate memory on s0\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; strcpy(s0,"&lt;A&gt;\\\\&lt;/A&gt;");&lt;BR&gt;&amp;nbsp;&amp;nbsp; strcat (s0, s2);&lt;BR&gt;&amp;nbsp;&amp;nbsp; listlocalcertstore(s0);&lt;BR&gt;&amp;nbsp;&amp;nbsp; free(s2);&lt;BR&gt;&amp;nbsp;&amp;nbsp; free(s0);&lt;BR&gt;} &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;void HandleError(char *s);&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;void listlocalcertstore(char const * const pszStoreName) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; HANDLE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hStoreHandle;&lt;BR&gt;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT&amp;nbsp; pCertContext=NULL;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT&amp;nbsp; pDupCertContext; &lt;BR&gt;&amp;nbsp;&amp;nbsp; PCERT_PUBLIC_KEY_INFO pOldPubKey = NULL;&lt;BR&gt;&amp;nbsp;&amp;nbsp; PCERT_PUBLIC_KEY_INFO pNewPubKey; &lt;BR&gt;&amp;nbsp;&amp;nbsp; char pszNameString[256];&lt;BR&gt;&amp;nbsp;&amp;nbsp; wchar_t pwszStoreName[256];&lt;BR&gt;&amp;nbsp;&amp;nbsp; swprintf(pwszStoreName, L"%S", pszStoreName);&lt;BR&gt;&amp;nbsp;&amp;nbsp; hStoreHandle = CertOpenStore(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_STORE_PROV_SYSTEM,&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; CERT_SYSTEM_STORE_LOCAL_MACHINE, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pwszStoreName &lt;BR&gt;&amp;nbsp;&amp;nbsp; );&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp; if(hStoreHandle)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // printf("The %s store has been opened. \n", pszStoreName);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HandleError("The store was not opened.");&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp; /* Find the certificates in the system store.&amp;nbsp; */&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp; while(pCertContext = CertEnumCertificatesInStore(hStoreHandle, pCertContext)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Get and display the name of subject of the certificate. */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, pszNameString, 128)) {&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; printf("\nCertificate: %s \n",pszNameString);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&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; HandleError("CertGetName failed.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, pszNameString, 128)) {&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; // printf("Issuer %s \n",pszNameString);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&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; HandleError("CertGetName failed.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILETIME expirytime;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SYSTEMTIME systime; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expirytime = pCertContext-&amp;gt;pCertInfo-&amp;gt;NotAfter;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileTimeToSystemTime(&amp;amp;expirytime, &amp;amp;systime);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Expiry date: %d %d %d\n", systime.wYear, systime.wMonth, systime.wDay);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; CertCloseStore(hStoreHandle, 0);&lt;BR&gt;} &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;void printError(DWORD messageId) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; LPSTR pBuf;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&amp;nbsp;&amp;nbsp; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, messageId, 0, (LPSTR) &amp;amp;pBuf, 0, NULL)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "%s\n", pBuf);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LocalFree(pBuf);&lt;BR&gt;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "Error %d (0x%x)\n", messageId);&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#008000 size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;void HandleError(char *s)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; DWORD dwErr = GetLastError();&lt;BR&gt;&amp;nbsp;&amp;nbsp; fprintf(stderr,"An error occurred in running the program. \n");&lt;BR&gt;&amp;nbsp;&amp;nbsp; fprintf(stderr,"%s\n",s);&lt;BR&gt;&amp;nbsp;&amp;nbsp; fprintf(stderr, "Error number %x.\n", dwErr);&lt;BR&gt;&amp;nbsp;&amp;nbsp; printError(dwErr);&lt;BR&gt;&amp;nbsp;&amp;nbsp; fprintf(stderr, "Program terminating. \n");&lt;BR&gt;&amp;nbsp;&amp;nbsp; exit(1);&lt;BR&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=422253" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item><item><title>Sample Code (Command) - Windows Vista Domain Join with smart card </title><link>http://blogs.technet.com/yaleli/archive/2006/03/26/422737.aspx</link><pubDate>Sun, 26 Mar 2006 03:00:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:422737</guid><dc:creator>Yale Li</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/yaleli/comments/422737.aspx</comments><wfw:commentRss>http://blogs.technet.com/yaleli/commentrss.aspx?PostID=422737</wfw:commentRss><wfw:comment>http://blogs.technet.com/yaleli/rsscomments.aspx?PostID=422737</wfw:comment><description>&lt;P&gt;After you require smart card interactive logon in your environment, the traditional domain join will not work because you don't have a password. Windows Vista resolves this problem by allowing domain join with smart card. However, this new feature will work only if you have Root CA certifcate on smart card. &lt;/P&gt;
&lt;P&gt;Here is how to enroll Root CA cert on smart card:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;1. Run "certutil –scroots deploy" from command line to enrollment Root CA cert&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;2. Run "&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;certutil –scroots view" to verify the cert&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;Certutil with new scroots switch&amp;nbsp;is a built-in tool in Windows Vista.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-ansi-language: EN-US"&gt;After you load Root CA cert, you will be able to&amp;nbsp;select a&amp;nbsp;smart card instead of username/password, and enter the PIN&amp;nbsp;to join a domain.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=422737" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/yaleli/archive/tags/6.+SampleCode/default.aspx">6. SampleCode</category></item></channel></rss>