Re: getting the PwdLastSet attrib value though .net

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance

From: Joe Kaplan \(MVP - ADSI\) (joseph.e.kaplan_at_removethis.accenture.com)
Date: 10/02/04


Date: Fri, 1 Oct 2004 23:09:59 -0500

You need to import the System.Runtime.InteropServices namespace in order to
get those attribute definitions.

Joe K.

"Sameh Ahmed" <essoplus@hotmail.com> wrote in message
news:%23EYG8JCqEHA.2588@TK2MSFTNGP12.phx.gbl...
> Dear Joe
> Thanks for replying
> as i am totaly new to the develeopment field i tried to understand the
> code
> that you sent.
> But after a long time i decided to copy it to my form and see what happens
> this part (that i failed to understand)
> <ComImport(), Guid("9068270b-0939-11D1-8be1-00c04fd8d503"),
> InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)> _
> Public Interface IADsLargeInteger
> Property HighPart() As Int32
> Property LowPart() As Int32
> End Interface
>
> fails with the following errors:
>
> Attribute cannot be used on 'IADsLargeInteger'.
> Type 'ComImport' is not defined.
> Type 'InterfaceTypeAttribute' is not defined.
>
> i would rerall appriciate it if you tell me what i should do .
> thanks again
>
> "Joe Kaplan (MVP - ADSI)" <joseph.e.kaplan@removethis.accenture.com> wrote
> in message news:e0z5IH3pEHA.3988@tk2msftngp13.phx.gbl...
>> There are basically two ways to get the Int64 value you need.
>>
>> If you use the DirectorySearcher, it marshals AD INTEGER8 types to .NET
>> Int64 automatically, so no work needs to be done. This is by far the
>> easiest way.
>>
>> If you use the DirectoryEntry, it marshals the value as an ADSI
>> IADsLargeInteger type, which at runtime is a System.__ComObject. This is
>> annoying, but you can get the value with a little interop and some data
>> munging. This works for me:
>>
>> dim entry as new DirectoryEntry("LDAP://yourdn here")
>> dim pwd as object = entry.Properties("pwdLastSet").Value
>> dim pwdDate as DateTime
>> pwdDate = DateTime.FromFileTimeUtc(GetInt64FromLargeInteger(pwd))
>>
>> Function GetInt64FromLargeInteger(byval largeInteger as Object) as Int64
>>
>> dim low as int32
>> dim high as int32
>> dim valBytes(7) as byte
>>
>> dim longInt as IADsLargeInteger = Ctype(largeInteger, IADsLargeInteger)
>> low = longInt.LowPart
>> high = longInt.HighPart
>>
>> BitConverter.GetBytes(low).CopyTo(valBytes, 0)
>> BitConverter.GetBytes(high).CopyTo(valBytes, 4)
>>
>> Return BitConverter.ToInt64(valBytes, 0)
>>
>> End Function
>>
>>
>> <ComImport(), Guid("9068270b-0939-11D1-8be1-00c04fd8d503"),
>> InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)> _
>> public interface IADsLargeInteger
>> property HighPart as int32
>> property LowPart as int32
>> end interface
>>
>> Note that you can also get the high and low values via reflection and
>> late
>> binding or by importing the activeds.dll COM object into .NET.
>>
>> Note that the DateTime you get back will be in Utc, so if you need local
>> time, make sure you call ToLocalTime.
>>
>> HTH,
>>
>> Joe K.
>>
>> "Sameh Ahmed" <essoplus@hotmail.com> wrote in message
>> news:uM5ZMazpEHA.3868@TK2MSFTNGP15.phx.gbl...
>> > Hello there
>> > I need to get the "PwdLastSet" of a user object to know when he last
>> > set
>> > his
>> > password.
>> > I am using DirectoryServices.DirectoryEntry to bind to the user object,
>> > but
>> > it either gives "Argument 'Prompt' cannot be converted to type
> 'String'."
>> > or
>> > when I use .tostring it returns "system._comobject"
>> > I even tried to use this line but it also failed
>> > dater.FromFileTimeUtc(entry.Properties("pwdlastset").Value) 'ast
>> > from
>> > type '_ComObject' to type 'Long' is not valid.
>> > I use the code below:
>> > Dim entry As New DirectoryServices.DirectoryEntry
>> > entry.Path = "LDAP://cn=sameh
>> > ahmed,ou=infrastracture,ou=masreya,dc=masreya,dc=local"
>> > MsgBox(entry.Properties("homedirectory").Item(0).ToString) 'works fine
>> > MsgBox(entry.Properties("pwdlastset").Item(0).ToString) 'returns
>> > "system._comobject"
>> > MsgBox(entry.Properties("pwdlastset").Value.ToString) 'returns
>> > "system._comobject"
>> > MsgBox(entry.Properties("pwdlastset").Value) 'returns
> "system._comobject"
>> > '
>> > "Argument 'Prompt' cannot be converted to type 'String'."
>> > Any ideas?
>> > Thanks in advance
>> > Sameh
>> >
>> >
>>
>>
>
>



Relevant Pages

  • Re: thrown exception in Marshal.PtrToStructure
    ... "Bill McCarthy" wrote: ... Public Const PRINTER_ENUM_SHARED As Int32 = 20 ... Dim pDescription As String ...
    (microsoft.public.dotnet.languages.vb)
  • Re: How to distinguish odd / even numbers and sumthem
    ... Public ReadOnly Property TotalOfOddsAs Int32 ... Public ReadOnly Property TotalOfEvens() As Int32 ... Dim oae As New OddsAndEvens ... Dim intTotOdds As Integer ...
    (microsoft.public.dotnet.languages.vb)
  • Re: How to distinguish odd / even numbers and sumthem
    ... Public ReadOnly Property TotalOfOddsAs Int32 ... Public ReadOnly Property TotalOfEvens() As Int32 ... Dim oae As New OddsAndEvens ... Dim intTotOdds As Integer ...
    (microsoft.public.dotnet.languages.vb)
  • Re: Using Visual Basic NET to Access Terminal Services Session and Client Information
    ... It also accesses the Client Information for the client which executes ... this program on a Terminal Services Server. ... Dim pWinStationName As String ' integer LPTSTR - Pointer to a null-terminated string containing the name of the WinStation for this session ... ByVal SessionId As Int32, ByVal WTSInfoClass As Int32, ByRef ppBuffer As String, ByRef pCount As Int32) As Boolean ...
    (microsoft.public.windows.terminal_services)
  • Re: MAC Address
    ... Also, note that it is easy to read the MAC addresses on the computer on which the code resides, but the server cannot read the MAC address of the client unless there is a program that reads this information on the client and passes it to the server. ... Dim pWinStationName As String ' integer LPTSTR - Pointer to a null-terminated string containing the name of the WinStation for this session ... ByVal SessionId As Int32, ByVal WTSInfoClass As Int32, ByRef ppBuffer As String, ByRef pCount As Int32) As Boolean ...
    (microsoft.public.windows.terminal_services)