<?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>Dwarfsoft [GPA] &#187; login</title>
	<atom:link href="http://www.dwarfsoft.com/blog/tag/login/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dwarfsoft.com/blog</link>
	<description>Great Programming Artistry</description>
	<lastBuildDate>Tue, 06 Sep 2011 11:18:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Last Login Time</title>
		<link>http://www.dwarfsoft.com/blog/2010/04/22/last-login-time/</link>
		<comments>http://www.dwarfsoft.com/blog/2010/04/22/last-login-time/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 01:54:33 +0000</pubDate>
		<dc:creator>dwarfsoft</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Tweet]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[bginfo]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.dwarfsoft.com/blog/?p=300</guid>
		<description><![CDATA[I have recently been having a look into determining the Last Login Time of a user for a BGInfo implementation. Firstly I had a look at the getCurrentUserLastLoginTime script suggested for use with BGInfo. The limitation of this script, however, is that it will reset the login time to the last time the Windows login [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently been having a look into determining the Last Login Time of a user for a BGInfo implementation. Firstly I had a look at the <a href="http://slingfive.com/pages/code/bgInfo_scripts/scripts/getCurrentUserLastLoginTime.vbs">getCurrentUserLastLoginTime script</a> suggested for use with BGInfo. The limitation of this script, however, is that it will reset the login time to the last time the Windows login box was Authenticated against, which also includes the time that the workstation was unlocked.</p>
<p>In order to maintain current BGInfo information the implementation is running periodically, so this is unnacceptable. Therefore I had to work to resolve the issue manually. As I have had a fair bit of experience with Windows Profiles recently (see the <a href="http://www.dwarfsoft.com/blog/2010/03/15/shared-user-profiles-staging-scripts/">last blog post</a>) I was familiar with the ProfileLoadTimeHigh and ProfileLoadTimeLow registry keys in the ProfileList. So I set out to determine how to actually use these to determine the login time. I first wrote some code to get the User SID based on the users &#8220;%userdomain%&#8221; and &#8220;%username%&#8221;:</p>
<p><span id="more-300"></span></p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #151B8D; font-weight: bold;">DIM</span> oNet, strComputerName, strUserName, strUserDomain
<span style="color: #151B8D; font-weight: bold;">SET</span> oNet = <span style="color: #E56717; font-weight: bold;">CreateObject</span>(<span style="color: #800000;">&quot;WScript.Network&quot;</span>)
strComputerName = oNet.Computername
strUserName = oNet.UserName
strUserDomain = oNet.UserDomain
<span style="color: #151B8D; font-weight: bold;">SET</span> oNet = <span style="color: #00C2FF; font-weight: bold;">nothing</span>
&nbsp;
<span style="color: #151B8D; font-weight: bold;">Set</span> WMI = <span style="color: #E56717; font-weight: bold;">GetObject</span>(<span style="color: #800000;">&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;</span>)
&nbsp;
SubKey = <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
<span style="color: #151B8D; font-weight: bold;">Set</span> wmiCol = WMI.ExecQuery (<span style="color: #800000;">&quot;SELECT Domain, Name, SID FROM Win32_Account where Name=&quot;</span><span style="color: #800000;">&quot;&quot;</span>&amp;strUserName&amp;<span style="color: #800000;">&quot;&quot;</span><span style="color: #800000;">&quot; And Domain=&quot;</span><span style="color: #800000;">&quot;&quot;</span>&amp;strUserDomain&amp;<span style="color: #800000;">&quot;&quot;</span><span style="color: #800000;">&quot;&quot;</span>)
<span style="color: #8D38C9; font-weight: bold;">For</span> <span style="color: #8D38C9; font-weight: bold;">each</span> wmiItem <span style="color: #8D38C9; font-weight: bold;">in</span> wmiCol
  SubKey = wmiItem.SID
  <span style="color: #E56717; font-weight: bold;">Exit</span> <span style="color: #8D38C9; font-weight: bold;">For</span>
<span style="color: #8D38C9; font-weight: bold;">Next</span></pre></div></div>

<p>So I set Subkey to be the String SID of the user, which I could then use to read the ProfileLoadTimeHigh and ProfileLoadTimeLow keys for the correct profile. I used the basic script from <a href="http://www.myitforum.com/forums/tm.aspx?high=&#038;m=163289&#038;mpage=1#163289">MyITForum</a>, however this failed to take into account the timezone on the local machine. Therefore the first thing I needed to do was get the users timezone.</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;">tz = 0
<span style="color: #8D38C9; font-weight: bold;">For</span> <span style="color: #8D38C9; font-weight: bold;">Each</span> os <span style="color: #8D38C9; font-weight: bold;">In</span> <span style="color: #E56717; font-weight: bold;">GetObject</span>(<span style="color: #800000;">&quot;winmgmts:&quot;</span>).InstancesOf (<span style="color: #800000;">&quot;Win32_OperatingSystem&quot;</span>)
  tz = os.CurrentTimeZone
  <span style="color: #E56717; font-weight: bold;">Exit</span> <span style="color: #8D38C9; font-weight: bold;">For</span>  
<span style="color: #8D38C9; font-weight: bold;">Next</span></pre></div></div>

<p>Then I integrated the Timezone offset (in minutes) into the <a href="http://www.myitforum.com/forums/tm.aspx?high=&#038;m=163289&#038;mpage=1#163289">original ProfileLoadTime script</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;">Const HKEY_LOCAL_MACHINE = &amp;H80000002
&nbsp;
strReturn = <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
<span style="color: #151B8D; font-weight: bold;">Set</span> objReg = <span style="color: #E56717; font-weight: bold;">GetObject</span>(<span style="color: #800000;">&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv&quot;</span>  )
strKeyPath = <span style="color: #800000;">&quot;SOFTWARE\MICROSOFT\Windows NT\CurrentVersion\ProfileList\&quot;</span> &amp; SubKey 
&nbsp;
strValueName = <span style="color: #800000;">&quot;ProfileLoadTimeHigh&quot;</span>
Return = objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,lngHighValue)
strValueName = <span style="color: #800000;">&quot;ProfileLoadTimeLow&quot;</span>
Return = objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,lngLowValue)
<span style="color: #8D38C9; font-weight: bold;">If</span> typename(lngHighValue) &lt;&gt; <span style="color: #800000;">&quot;Null&quot;</span> <span style="color: #8D38C9; font-weight: bold;">then</span>
  NanoSecs = (lngHighValue * 2 ^ 32 + lngLowValue)
  <span style="color: #008000;">'' /* Returns time in Workstation Timezone */
</span>  DT = #1/1/1601# + (NanoSecs / 600000000 / 1440) + (tz / 1440)
  strReturn = CDate(DT)
<span style="color: #8D38C9; font-weight: bold;">End</span> <span style="color: #8D38C9; font-weight: bold;">if</span></pre></div></div>

<p>Finally the output is printed as per a standard BGInfo script</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #151B8D; font-weight: bold;">On</span> <span style="color: #151B8D; font-weight: bold;">Error</span> <span style="color: #151B8D; font-weight: bold;">Resume</span> <span style="color: #8D38C9; font-weight: bold;">Next</span>
	<span style="color: #E56717; font-weight: bold;">call</span> WScript.Echo(strReturn)	<span style="color: #008000;">'for cmd line
</span>	<span style="color: #E56717; font-weight: bold;">call</span> Echo(strReturn)	<span style="color: #008000;">'for BGInfo
</span><span style="color: #151B8D; font-weight: bold;">on</span> <span style="color: #151B8D; font-weight: bold;">error</span> <span style="color: #8D38C9; font-weight: bold;">goto</span> 0</pre></div></div>

<p>This works for Power Users as well, which the original script did not (due to permissions issues). Hope this helped you in some way <img src='http://www.dwarfsoft.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Cheers, Chris.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwarfsoft.com/blog/2010/04/22/last-login-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

