[RESOLVED] help with LsaRetrievePrivateData
Hi,
I am having trouble getting data from LsaRetrievePrivateData.
here is the code
Code:
<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
Re: help with LsaRetrievePrivateData
When you say its "not working" what exactly do you mean? What happens when this code runs? Do you get an exception? If so, what is it? etc etc
Re: help with LsaRetrievePrivateData
Quote:
I have a function that Set the Secret and that all works fine.
If you can't retrieve the value how do you know that it worked?
Re: help with LsaRetrievePrivateData
Ok, I have got it working.
Changed
Code:
<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
To
Code:
<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 LSA_UNICODE_STRING) As UInteger
End Function
and the function looks like this.
Code:
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.
Re: [RESOLVED] help with LsaRetrievePrivateData
Ah yeah that would make sense, as that's how MSDN defines it (no idea why you had it as a Long originally really) http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Also, MSDN does say "Do not use the LSA private data functions. Instead, use the CryptProtectData and CryptUnprotectData functions."