Click here to Skip to main content
15,886,806 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,

I am having trouble getting data from LsaRetrievePrivateData.

here is the code
VB
<DllImport("advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True, PreserveSig:=True)> _
    Private Shared Function LsaRetrievePrivateData(ByVal policyHandle As IntPtr, ByRef KeyName As LSA_UNICODE_STRING, ByRef PrivateData As Long) As UInteger
    End Function

<DllImport("advapi32.dll", PreserveSig:=True)> _
    Private Shared Function LsaOpenPolicy(ByRef SystemName As LSA_UNICODE_STRING, ByRef ObjectAttributes As LSA_OBJECT_ATTRIBUTES, ByVal DesiredAccess As Int32, ByRef PolicyHandle As IntPtr) As UInt32
    End Function

Private Function GetSecret() As String
    Dim lusSecretData As New LSA_UNICODE_STRING()
    Dim PrivateData As Long
    Dim Value As String

    Dim LsaPolicyHandle As IntPtr = GetLsaPolicy(LSA_AccessPolicy.POLICY_GET_PRIVATE_INFORMATION)
    Dim result As UInteger = LsaRetrievePrivateData(LsaPolicyHandle, secretName, PrivateData)
    ReleaseLsaPolicy(LsaPolicyHandle)

    If result <> 0 Then
        Dim lastError As String = "RetrievePrivateData failed: " & Marshal.GetLastWin32Error & " " & New System.ComponentModel.Win32Exception().Message
        Throw New Exception(lastError)
    End If

    lusSecretData = DirectCast(Marshal.PtrToStructure(PrivateData, GetType(LSA_UNICODE_STRING)), LSA_UNICODE_STRING)
    Value = Marshal.PtrToStringUni(lusSecretData.Buffer)

    'lusSecretData = Marshal.PtrToStructure(PrivateData, GetType(LSA_UNICODE_STRING))
    'Value = Marshal.PtrToStringAuto(lusSecretData.Buffer).Substring(0, lusSecretData.Length / 2)

    Return Value
End Function

GetLsaPolicy is a function that returns the LsaPolicyHandle
ReleaseLsaPolicy is a function that closes the LsaPolicyHandle

I have a function that Set the Secret and that all works fine.

What isn't working is the bold sections to get the value back, is there anyone that can guide me in the right direction.

Thanks
Rodney
Posted
Updated 5-Oct-12 18:15pm
v2

1 solution

Ok, I have got it working.

Changed
VB
<dllimport("advapi32.dll",> _
    Private Shared Function LsaRetrievePrivateData(ByVal policyHandle As IntPtr, ByRef KeyName As LSA_UNICODE_STRING, ByRef PrivateData As Long) As UInteger
    End Function

To
VB
<dllimport("advapi32.dll",> _
    Private Shared Function LsaRetrievePrivateData(ByVal policyHandle As IntPtr, ByRef KeyName As LSA_UNICODE_STRING, ByRef PrivateData As LSA_UNICODE_STRING) As UInteger
    End Function


and the function looks like this.
VB
Private Function GetSecret() As String
    Dim lusSecretData As New LSA_UNICODE_STRING()
    Dim PrivateData As IntPtr
    Dim Value As String = ""

    Dim LsaPolicyHandle As IntPtr = GetLsaPolicy(LSA_AccessPolicy.POLICY_GET_PRIVATE_INFORMATION)
    Dim result As UInteger = LsaRetrievePrivateData(LsaPolicyHandle, secretName, PrivateData)
    ReleaseLsaPolicy(LsaPolicyHandle)

    If result <> 0 Then
        Dim lastError As String = "RetrievePrivateData failed: " & Marshal.GetLastWin32Error & " " & New System.ComponentModel.Win32Exception().Message
        Throw New Exception(lastError)
    End If

    lusSecretData = Marshal.PtrToStructure(PrivateData, GetType(LSA_UNICODE_STRING))
    If lusSecretData.Length > 0 Then
        Value = Marshal.PtrToStringAuto(lusSecretData.Buffer).Substring(0, lusSecretData.Length / 2)
    End If
    LsaFreeMemory(PrivateData)

    Return Value
End Function

This is now resolved.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900