Hi Everyone,
Recently in our environment, we moved from the thinkclient 5.5 Vsphere software to the Webclient 6.5 Software on our ESX host. During that time our integration is broken under Vsphere 5.5 Powercli (Based on .NET 2.0 Framework). Now it seems in 6.5 it's now called Vmware Powercli and one of the components inside is actually the VSphere PowerCli component which is what I want. I did the upgrade and it impacted the project on recompile giving a bunch of undefined errors for Vmware.Vim.virtualmachine. After that, I discovered I needed to move to .Net 4.5 but it seems the Passthrough Token SSPI authentication is no longer functioning as normal. Everything else seems to work like a charm. My code is below for the SSPI authentication. This code was tested and verified to work with 5.5
[code]
Imports System.Runtime.InteropServices
Imports System.Security.Principal
Imports VMware.Vim
Imports System.Xml.Serialization
Imports System.Xml
Imports System.Runtime.Serialization
Module SSPIClient
End Module
Public Class SspiClients
Private ReadOnly _sspiHelper As SspiHelper
Private ReadOnly _sspiPackageType As SspiPackageType
Private _clientToken As Byte()
Private _continueProcessing As Boolean
Public Sub New(ByVal principalName As String, ByVal sspiPackageType As SspiPackageType)
_sspiHelper = New SspiHelper(principalName)
_sspiPackageType = sspiPackageType
_sspiHelper.InitializeClient(_clientToken, Nothing, _continueProcessing, _sspiPackageType)
End Sub
Public ReadOnly Property Token() As Byte()
Get
Return _clientToken
End Get
End Property
Public Sub Initialize(ByVal serverToken As Byte())
_sspiHelper.InitializeClient(_clientToken, serverToken, _continueProcessing, _sspiPackageType)
End Sub
End Class
Public Enum SspiPackageType
Kerberos
NTLM
Negotiate
End Enum
Friend NotInheritable Class FaultConverter
Private Sub New()
End Sub
Public Shared Function CreateMethodFault(ByVal exception As Exception) As MethodFault
Dim fault As MethodFault = Nothing
If exception Is Nothing Then
Return Nothing
End If
Dim soapException As SoapException = If(TryCast(exception, SoapException), TryCast(exception.InnerException, SoapException))
If soapException IsNot Nothing Then
'fault = ConvertSoapException(soapException)
End If
Return fault
End Function
End Class
Public Class MethodFaultUnused
Public Sub New()
End Sub
<XmlElement("dynamicProperty")> _
Public Property dynamicProperty() As DynamicProperty()
Get
Return m_dynamicProperty
End Get
Set(ByVal value As DynamicProperty())
m_dynamicProperty = value
End Set
End Property
Private m_dynamicProperty As DynamicProperty()
Public Property dynamicType() As String
Get
Return m_dynamicType
End Get
Set(ByVal value As String)
m_dynamicType = value
End Set
End Property
Private m_dynamicType As String
Public Property faultCause() As LocalizedMethodFault
Get
Return m_faultCause
End Get
Set(ByVal value As LocalizedMethodFault)
m_faultCause = value
End Set
End Property
Private m_faultCause As LocalizedMethodFault
<XmlElement("faultMessage")> _
Public Property faultMessage() As LocalizableMessage()
Get
Return m_faultMessage
End Get
Set(ByVal value As LocalizableMessage())
m_faultMessage = value
End Set
End Property
Private m_faultMessage As LocalizableMessage()
End Class
Friend Class SspiHelper
Private Const MAX_TOKEN_SIZE As Integer = 12288
Public Const STANDARD_CONTEXT_ATTRIBUTES As Integer = NativeContants.ISC_REQ_CONFIDENTIALITY Or NativeContants.ISC_REQ_REPLAY_DETECT Or NativeContants.ISC_REQ_SEQUENCE_DETECT Or NativeContants.ISC_REQ_CONNECTION
Public Const TOKEN_QUERY As Integer = &H8
Private ReadOnly _sAccountName As String
Private _bGotClientCredentials As Boolean
Private _bGotServerContext As Boolean
Private _bGotServerCredentials As Boolean
Private _hClientContext As New SECURITY_HANDLE(0)
Private _hInboundCred As New SECURITY_HANDLE(0)
Private _hOutboundCred As New SECURITY_HANDLE(0)
Private _hServerContext As New SECURITY_HANDLE(0)
Public Sub New()
Dim windowsIdentity__1 As WindowsIdentity = WindowsIdentity.GetCurrent()
If windowsIdentity__1 IsNot Nothing Then
_sAccountName = windowsIdentity__1.Name
End If
End Sub
Public Sub New(ByVal sRemotePrincipal As String)
_sAccountName = sRemotePrincipal
End Sub
Public Sub InitializeClient(ByRef clientToken As Byte(), ByVal serverToken As Byte(), ByRef bContinueProcessing As Boolean, Optional ByVal sspiPackageType__1 As SspiPackageType = SspiPackageType.Negotiate)
clientToken = Nothing
bContinueProcessing = True
Dim clientLifeTime = New SECURITY_INTEGER(0)
If Not _bGotClientCredentials Then
Dim result As Integer = NativeMethods.AcquireCredentialsHandle(_sAccountName, sspiPackageType__1.ToString(), NativeContants.SECPKG_CRED_OUTBOUND, IntPtr.Zero, IntPtr.Zero, 0, _
IntPtr.Zero, _hOutboundCred, clientLifeTime)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("Couldn't acquire client credentials", result)
End If
_bGotClientCredentials = True
End If
Dim ss As Integer
Dim clientTokenSecBufferDesc = New SecBufferDesc(MAX_TOKEN_SIZE)
Try
Dim contextAttributes As UInteger
If serverToken Is Nothing Then
' null string pszTargetName,
'int Reserved1,
'int TargetDataRep
'Always zero first time around...
'int Reserved2,
'pHandle CtxtHandle = SecHandle
'ref SecBufferDesc pOutput, //PSecBufferDesc
'ref int pfContextAttr,
'ref IntPtr ptsExpiry ); //PTimeStamp
ss = NativeMethods.InitializeSecurityContext(_hOutboundCred, IntPtr.Zero, _sAccountName, STANDARD_CONTEXT_ATTRIBUTES, 0, NativeContants.SECURITY_NATIVE_DREP, _
IntPtr.Zero, 0, _hClientContext, clientTokenSecBufferDesc, contextAttributes, clientLifeTime)
Else
Dim serverTokenSecBufferDesc = New SecBufferDesc(serverToken)
Try
' null string pszTargetName,
'int Reserved1,
'int TargetDataRep
'Always zero first time around...
'int Reserved2,
'pHandle CtxtHandle = SecHandle
'ref SecBufferDesc pOutput, //PSecBufferDesc
'ref int pfContextAttr,
'ref IntPtr ptsExpiry ); //PTimeStamp
ss = NativeMethods.InitializeSecurityContext(_hOutboundCred, _hClientContext, _sAccountName, STANDARD_CONTEXT_ATTRIBUTES, 0, NativeContants.SECURITY_NATIVE_DREP, _
serverTokenSecBufferDesc, 0, _hClientContext, clientTokenSecBufferDesc, contextAttributes, clientLifeTime)
Finally
serverTokenSecBufferDesc.Dispose()
End Try
End If
If ss <> NativeContants.SEC_E_OK AndAlso ss <> NativeContants.SEC_I_CONTINUE_NEEDED Then
Throw New SspiException("InitializeSecurityContext() failed!!!", ss)
End If
clientToken = clientTokenSecBufferDesc.GetSecBufferByteArray()
Finally
clientTokenSecBufferDesc.Dispose()
End Try
bContinueProcessing = ss <> NativeContants.SEC_E_OK
End Sub
Public Sub InitializeServer(ByVal clientToken As Byte(), ByRef serverToken As Byte(), ByRef bContinueProcessing As Boolean, Optional ByVal sspiPackageType__1 As SspiPackageType = SspiPackageType.Negotiate)
serverToken = Nothing
bContinueProcessing = True
Dim newLifeTime = New SECURITY_INTEGER(0)
If Not _bGotServerCredentials Then
Dim result As Integer = NativeMethods.AcquireCredentialsHandle(_sAccountName, sspiPackageType__1.ToString(), NativeContants.SECPKG_CRED_INBOUND, IntPtr.Zero, IntPtr.Zero, 0, _
IntPtr.Zero, _hInboundCred, newLifeTime)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("Couldn't acquire server credentials handle!!!", result)
End If
_bGotServerCredentials = True
End If
Dim serverTokenSecBufferDesc = New SecBufferDesc(MAX_TOKEN_SIZE)
Dim clientTokenSecBufferDesc = New SecBufferDesc(clientToken)
Try
Dim ss As Integer
Dim uNewContextAttr As UInteger
If Not _bGotServerContext Then
' [in] handle to the credentials
' [in/out] handle of partially formed context. Always NULL the first time through
' [in] pointer to the input buffers
' [in] required context attributes
' [in] data representation on the target
' [in/out] receives the new context handle
' [in/out] pointer to the output buffers
' [out] receives the context attributes
' [out] receives the life span of the security context
ss = NativeMethods.AcceptSecurityContext(_hInboundCred, IntPtr.Zero, clientTokenSecBufferDesc, STANDARD_CONTEXT_ATTRIBUTES, NativeContants.SECURITY_NATIVE_DREP, _hServerContext, _
serverTokenSecBufferDesc, uNewContextAttr, newLifeTime)
Else
' [in] handle to the credentials
' [in/out] handle of partially formed context. Always NULL the first time through
' [in] pointer to the input buffers
' [in] required context attributes
' [in] data representation on the target
' [in/out] receives the new context handle
' [in/out] pointer to the output buffers
' [out] receives the context attributes
' [out] receives the life span of the security context
ss = NativeMethods.AcceptSecurityContext(_hInboundCred, _hServerContext, clientTokenSecBufferDesc, STANDARD_CONTEXT_ATTRIBUTES, NativeContants.SECURITY_NATIVE_DREP, _hServerContext, _
serverTokenSecBufferDesc, uNewContextAttr, newLifeTime)
End If
If ss <> NativeContants.SEC_E_OK AndAlso ss <> NativeContants.SEC_I_CONTINUE_NEEDED Then
Throw New SspiException("AcceptSecurityContext() failed!!!", ss)
End If
If Not _bGotServerContext Then
_bGotServerContext = True
End If
serverToken = serverTokenSecBufferDesc.GetSecBufferByteArray()
bContinueProcessing = ss <> NativeContants.SEC_E_OK
Finally
clientTokenSecBufferDesc.Dispose()
serverTokenSecBufferDesc.Dispose()
End Try
End Sub
Public Sub EncryptMessage(ByVal message As Byte(), ByVal bUseClientContext As Boolean, ByRef encryptedBuffer As Byte())
encryptedBuffer = Nothing
Dim encryptionContext As SECURITY_HANDLE = _hServerContext
If bUseClientContext Then
encryptionContext = _hClientContext
End If
Dim contextSizes As SecPkgContext_Sizes
Dim result As Integer = NativeMethods.QueryContextAttributes(encryptionContext, NativeContants.SECPKG_ATTR_SIZES, contextSizes)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("QueryContextAttribute() failed!!!", result)
End If
Dim thisSecHelper = New MultipleSecBufferHelper(1) {}
thisSecHelper(0) = New MultipleSecBufferHelper(message, SecBufferType.SECBUFFER_DATA)
thisSecHelper(1) = New MultipleSecBufferHelper(New Byte(contextSizes.cbSecurityTrailer - 1) {}, SecBufferType.SECBUFFER_TOKEN)
Dim descBuffer = New SecBufferDesc(thisSecHelper)
Try
result = NativeMethods.EncryptMessage(encryptionContext, 0, descBuffer, 0)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("EncryptMessage() failed!!!", result)
End If
encryptedBuffer = descBuffer.GetSecBufferByteArray()
Finally
descBuffer.Dispose()
End Try
End Sub
Public Sub DecryptMessage(ByVal messageLength As Integer, ByVal encryptedBuffer As Byte(), ByVal bUseClientContext As Boolean, ByRef decryptedBuffer As Byte())
decryptedBuffer = Nothing
Dim decryptionContext As SECURITY_HANDLE = _hServerContext
If bUseClientContext Then
decryptionContext = _hClientContext
End If
Dim encryptedMessage = New Byte(messageLength - 1) {}
Array.Copy(encryptedBuffer, 0, encryptedMessage, 0, messageLength)
Dim securityTrailerLength As Integer = encryptedBuffer.Length - messageLength
Dim securityTrailer = New Byte(securityTrailerLength - 1) {}
Array.Copy(encryptedBuffer, messageLength, securityTrailer, 0, securityTrailerLength)
Dim thisSecHelper = New MultipleSecBufferHelper(1) {}
thisSecHelper(0) = New MultipleSecBufferHelper(encryptedMessage, SecBufferType.SECBUFFER_DATA)
thisSecHelper(1) = New MultipleSecBufferHelper(securityTrailer, SecBufferType.SECBUFFER_TOKEN)
Dim descBuffer = New SecBufferDesc(thisSecHelper)
Try
Dim encryptionQuality As UInteger
Dim result As Integer = NativeMethods.DecryptMessage(decryptionContext, descBuffer, 0, encryptionQuality)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("DecryptMessage() failed!!!", result)
End If
decryptedBuffer = New Byte(messageLength - 1) {}
Array.Copy(descBuffer.GetSecBufferByteArray(), 0, decryptedBuffer, 0, messageLength)
Finally
descBuffer.Dispose()
End Try
End Sub
Public Sub SignMessage(ByVal message As Byte(), ByVal bUseClientContext As Boolean, ByRef signedBuffer As Byte(), ByRef hServerContext As SECURITY_HANDLE)
signedBuffer = Nothing
Dim encryptionContext As SECURITY_HANDLE = _hServerContext
If bUseClientContext Then
encryptionContext = _hClientContext
End If
Dim contextSizes As SecPkgContext_Sizes
Dim result As Integer = NativeMethods.QueryContextAttributes(encryptionContext, NativeContants.SECPKG_ATTR_SIZES, contextSizes)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("QueryContextAttribute() failed!!!", result)
End If
Dim thisSecHelper = New MultipleSecBufferHelper(1) {}
thisSecHelper(0) = New MultipleSecBufferHelper(message, SecBufferType.SECBUFFER_DATA)
thisSecHelper(1) = New MultipleSecBufferHelper(New Byte(contextSizes.cbMaxSignature - 1) {}, SecBufferType.SECBUFFER_TOKEN)
Dim descBuffer = New SecBufferDesc(thisSecHelper)
Try
result = NativeMethods.MakeSignature(encryptionContext, 0, descBuffer, 0)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("MakeSignature() failed!!!", result)
End If
'SSPIHelper.SignAndVerify(ref _hClientContext,ref hServerContext,ref DescBuffer);
Dim encryptionQuality As UInteger
NativeMethods.VerifySignature(_hServerContext, descBuffer, 0, encryptionQuality)
signedBuffer = descBuffer.GetSecBufferByteArray()
Finally
descBuffer.Dispose()
End Try
End Sub
Public Sub VerifyMessage(ByVal messageLength As Integer, ByVal signedBuffer As Byte(), ByVal bUseClientContext As Boolean, ByRef verifiedBuffer As Byte())
verifiedBuffer = Nothing
Dim decryptionContext As SECURITY_HANDLE = _hServerContext
If bUseClientContext Then
decryptionContext = _hClientContext
End If
Dim signedMessage = New Byte(messageLength - 1) {}
Array.Copy(signedBuffer, 0, signedMessage, 0, messageLength)
Dim signatureLength As Integer = signedBuffer.Length - messageLength
Dim signature = New Byte(signatureLength - 1) {}
Array.Copy(signedBuffer, messageLength, signature, 0, signatureLength)
Dim thisSecHelper = New MultipleSecBufferHelper(1) {}
thisSecHelper(0) = New MultipleSecBufferHelper(signedMessage, SecBufferType.SECBUFFER_DATA)
thisSecHelper(1) = New MultipleSecBufferHelper(signature, SecBufferType.SECBUFFER_TOKEN)
Dim descBuffer = New SecBufferDesc(thisSecHelper)
Try
Dim encryptionQuality As UInteger
Dim result As Integer = NativeMethods.VerifySignature(decryptionContext, descBuffer, 0, encryptionQuality)
If result <> NativeContants.SEC_E_OK Then
Throw New SspiException("VerifySignature() failed!!!", result)
End If
verifiedBuffer = New Byte(messageLength - 1) {}
Array.Copy(descBuffer.GetSecBufferByteArray(), 0, verifiedBuffer, 0, messageLength)
Finally
descBuffer.Dispose()
End Try
End Sub
End Class
Public NotInheritable Class NativeContants
Private Sub New()
End Sub
Public Const ISC_REQ_CONFIDENTIALITY As Integer = &H10
Public Const ISC_REQ_CONNECTION As Integer = &H800
Public Const ISC_REQ_REPLAY_DETECT As Integer = &H4
Public Const ISC_REQ_SEQUENCE_DETECT As Integer = &H8
Public Const SEC_E_OK As Integer = 0
Public Const SEC_I_CONTINUE_NEEDED As Integer = &H90312
Public Const SECPKG_ATTR_SIZES As Integer = 0
Public Const SECPKG_CRED_INBOUND As Integer = 1
Public Const SECPKG_CRED_OUTBOUND As Integer = 2
Public Const SECURITY_NATIVE_DREP As Integer = &H10
End Class
Friend NotInheritable Class NativeMethods
Private Sub New()
End Sub
'SEC_CHAR*
'SEC_CHAR* //"Kerberos","NTLM","Negotiative"
'_LUID AuthenticationID,//pvLogonID, //PLUID
'PVOID
'SEC_GET_KEY_FN
'PVOID
'SecHandle //PCtxtHandle ref
<DllImport("secur32", CharSet:=CharSet.Unicode)> _
Friend Shared Function AcquireCredentialsHandle(ByVal pszPrincipal As String, ByVal pszPackage As String, ByVal fCredentialUse As Integer, ByVal pAuthenticationId As IntPtr, ByVal pAuthData As IntPtr, ByVal pGetKeyFn As Integer, _
ByVal pvGetKeyArgument As IntPtr, ByRef phCredential As SECURITY_HANDLE, ByRef ptsExpiry As SECURITY_INTEGER) As Integer
End Function
'PTimeStamp //TimeStamp ref
'PCredHandle
'PCtxtHandle
'PSecBufferDesc SecBufferDesc
'PCtxtHandle
'PSecBufferDesc SecBufferDesc
'managed ulong == 64 bits!!!
<DllImport("secur32", CharSet:=CharSet.Unicode, SetLastError:=True)> _
Friend Shared Function InitializeSecurityContext(ByRef phCredential As SECURITY_HANDLE, ByVal phContext As IntPtr, ByVal pszTargetName As String, ByVal fContextReq As Integer, ByVal reserved1 As Integer, ByVal targetDataRep As Integer, _
ByVal pInput As IntPtr, ByVal reserved2 As Integer, ByRef phNewContext As SECURITY_HANDLE, ByRef pOutput As SecBufferDesc, ByRef pfContextAttr As UInteger, ByRef ptsExpiry As SECURITY_INTEGER) As Integer
End Function
'PTimeStamp
'PCredHandle
'PCtxtHandle
'PSecBufferDesc SecBufferDesc
'PCtxtHandle
'PSecBufferDesc SecBufferDesc
'managed ulong == 64 bits!!!
<DllImport("secur32", CharSet:=CharSet.Unicode, SetLastError:=True)> _
Friend Shared Function InitializeSecurityContext(ByRef phCredential As SECURITY_HANDLE, ByRef phContext As SECURITY_HANDLE, ByVal pszTargetName As String, ByVal fContextReq As Integer, ByVal reserved1 As Integer, ByVal targetDataRep As Integer, _
ByRef secBufferDesc As SecBufferDesc, ByVal reserved2 As Integer, ByRef phNewContext As SECURITY_HANDLE, ByRef pOutput As SecBufferDesc, ByRef pfContextAttr As UInteger, ByRef ptsExpiry As SECURITY_INTEGER) As Integer
End Function
'PTimeStamp
'managed ulong == 64 bits!!!
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function AcceptSecurityContext(ByRef phCredential As SECURITY_HANDLE, ByVal phContext As IntPtr, ByRef pInput As SecBufferDesc, ByVal fContextReq As UInteger, ByVal targetDataRep As UInteger, ByRef phNewContext As SECURITY_HANDLE, _
ByRef pOutput As SecBufferDesc, ByRef pfContextAttr As UInteger, ByRef ptsTimeStamp As SECURITY_INTEGER) As Integer
End Function
'managed ulong == 64 bits!!!
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function AcceptSecurityContext(ByRef phCredential As SECURITY_HANDLE, ByRef phContext As SECURITY_HANDLE, ByRef pInput As SecBufferDesc, ByVal fContextReq As UInteger, ByVal targetDataRep As UInteger, ByRef phNewContext As SECURITY_HANDLE, _
ByRef pOutput As SecBufferDesc, ByRef pfContextAttr As UInteger, ByRef ptsTimeStamp As SECURITY_INTEGER) As Integer
End Function
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function ImpersonateSecurityContext(ByRef phContext As SECURITY_HANDLE) As Integer
End Function
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function QueryContextAttributes(ByRef phContext As SECURITY_HANDLE, ByVal ulAttribute As UInteger, ByRef pContextAttributes As SecPkgContext_Sizes) As Integer
End Function
'managed ulong == 64 bits!!!
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function EncryptMessage(ByRef phContext As SECURITY_HANDLE, ByVal fQop As UInteger, ByRef pMessage As SecBufferDesc, ByVal messageSeqNo As UInteger) As Integer
End Function
'managed ulong == 64 bits!!!
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function DecryptMessage(ByRef phContext As SECURITY_HANDLE, ByRef pMessage As SecBufferDesc, ByVal messageSeqNo As UInteger, ByRef pfQop As UInteger) As Integer
End Function
' Context to use
' Quality of Protection
' Message to sign
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function MakeSignature(ByRef phContext As SECURITY_HANDLE, ByVal fQop As UInteger, ByRef pMessage As SecBufferDesc, ByVal messageSeqNo As UInteger) As Integer
End Function
' Message Sequence Num.
' Context to use
' Message to sign
' Message Sequence Num.
<DllImport("secur32.Dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Friend Shared Function VerifySignature(ByRef phContext As SECURITY_HANDLE, ByRef pMessage As SecBufferDesc, ByVal messageSeqNo As UInteger, ByRef pfQop As UInteger) As Integer
End Function
' Quality of Protection
End Class
#Region "NetResource Struct"
<StructLayout(LayoutKind.Sequential)> _
Public Structure NetResource
Public Scope As UInteger
Public Type As UInteger
Public DisplayType As UInteger
Public Usage As UInteger
Public LocalName As String
Public RemoteName As String
Public Comment As String
Public Provider As String
End Structure
#End Region
#Region "Enums"
Public Enum Scope
RESOURCE_CONNECTED = 1
RESOURCE_GLOBALNET
RESOURCE_REMEMBERED
RESOURCE_RECENT
RESOURCE_CONTEXT
End Enum
Public Enum Type As UInteger
RESOURCETYPE_ANY
RESOURCETYPE_DISK
RESOURCETYPE_PRINT
RESOURCETYPE_RESERVED = 8
RESOURCETYPE_UNKNOWN = 4294967295UI
End Enum
Public Enum DisplayType
RESOURCEDISPLAYTYPE_GENERIC
RESOURCEDISPLAYTYPE_DOMAIN
RESOURCEDISPLAYTYPE_SERVER
RESOURCEDISPLAYTYPE_SHARE
RESOURCEDISPLAYTYPE_FILE
RESOURCEDISPLAYTYPE_GROUP
RESOURCEDISPLAYTYPE_NETWORK
RESOURCEDISPLAYTYPE_ROOT
RESOURCEDISPLAYTYPE_SHAREADMIN
RESOURCEDISPLAYTYPE_DIRECTORY
RESOURCEDISPLAYTYPE_TREE
RESOURCEDISPLAYTYPE_NDSCONTAINER
End Enum
Public Enum Usage As UInteger
RESOURCEUSAGE_CONNECTABLE = 1
RESOURCEUSAGE_CONTAINER = 2
RESOURCEUSAGE_NOLOCALDEVICE = 4
RESOURCEUSAGE_SIBLING = 8
RESOURCEUSAGE_ATTACHED = 16
RESOURCEUSAGE_ALL = 31
RESOURCEUSAGE_RESERVED = 2147483648UI
End Enum
Public Enum ConnectionFlags As UInteger
CONNECT_UPDATE_PROFILE = 1
CONNECT_UPDATE_RECENT = 2
CONNECT_TEMPORARY = 4
CONNECT_INTERACTIVE = 8
CONNECT_PROMPT = 16
CONNECT_NEED_DRIVE = 32
CONNECT_REFCOUNT = 64
CONNECT_REDIRECT = 128
CONNECT_LOCALDRIVE = 256
CONNECT_CURRENT_MEDIA = 512
CONNECT_DEFERRED = 1024
CONNECT_COMMANDLINE = 2048
CONNECT_CMD_SAVECRED = 4096
CONNECT_CRED_RESET = 8192
CONNECT_RESERVED = 4278190080UI
End Enum
#End Region
#Region "for sspi helper"
Public Enum SecBufferType
SECBUFFER_VERSION = 0
SECBUFFER_EMPTY = 0
SECBUFFER_DATA = 1
SECBUFFER_TOKEN = 2
End Enum
<StructLayout(LayoutKind.Sequential)> _
Public Structure SecHandle
'=PCtxtHandle
Private ReadOnly dwLower As UInteger
Private ReadOnly dwUpper As UInteger
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure SecBuffer
Public cbBuffer As Integer
Public BufferType As Integer
Friend pvBuffer As IntPtr
Public Sub New(ByVal bufferSize As Integer)
cbBuffer = bufferSize
BufferType = CInt(SecBufferType.SECBUFFER_TOKEN)
pvBuffer = Marshal.AllocHGlobal(bufferSize)
End Sub
Public Sub New(ByVal secBufferBytes As Byte())
cbBuffer = secBufferBytes.Length
BufferType = CInt(SecBufferType.SECBUFFER_TOKEN)
pvBuffer = Marshal.AllocHGlobal(cbBuffer)
Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer)
End Sub
Public Sub New(ByVal secBufferBytes As Byte(), ByVal bufferType__1 As SecBufferType)
cbBuffer = secBufferBytes.Length
BufferType = CInt(bufferType__1)
pvBuffer = Marshal.AllocHGlobal(cbBuffer)
Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer)
End Sub
Public Sub Dispose()
If pvBuffer <> IntPtr.Zero Then
Marshal.FreeHGlobal(pvBuffer)
pvBuffer = IntPtr.Zero
End If
End Sub
End Structure
Public Structure MultipleSecBufferHelper
Public Buffer As Byte()
Public BufferType As SecBufferType
Public Sub New(ByVal buffer__1 As Byte(), ByVal bufferType__2 As SecBufferType)
If buffer__1 Is Nothing OrElse buffer__1.Length = 0 Then
Throw New ArgumentException("buffer cannot be null or 0 length")
End If
Buffer = buffer__1
BufferType = bufferType__2
End Sub
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure SecBufferDesc
Public ulVersion As Integer
Public cBuffers As Integer
Public pBuffers As IntPtr
'Point to SecBuffer
Public Sub New(ByVal bufferSize As Integer)
ulVersion = CInt(SecBufferType.SECBUFFER_VERSION)
cBuffers = 1
Dim thisSecBuffer = New SecBuffer(bufferSize)
pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(thisSecBuffer))
Marshal.StructureToPtr(thisSecBuffer, pBuffers, False)
End Sub
Public Sub New(ByVal secBufferBytes As Byte())
ulVersion = CInt(SecBufferType.SECBUFFER_VERSION)
cBuffers = 1
Dim thisSecBuffer = New SecBuffer(secBufferBytes)
pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(thisSecBuffer))
Marshal.StructureToPtr(thisSecBuffer, pBuffers, False)
End Sub
Public Sub New(ByVal secBufferBytesArray As MultipleSecBufferHelper())
If secBufferBytesArray Is Nothing OrElse secBufferBytesArray.Length = 0 Then
Throw New ArgumentException("secBufferBytesArray cannot be null or 0 length")
End If
ulVersion = CInt(SecBufferType.SECBUFFER_VERSION)
cBuffers = secBufferBytesArray.Length
'Allocate memory for SecBuffer Array....
pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(SecBuffer)) * cBuffers)
For index As Integer = 0 To secBufferBytesArray.Length - 1
'Super hack: Now allocate memory for the individual SecBuffers
'and just copy the bit values to the SecBuffer array!!!
Dim thisSecBuffer = New SecBuffer(secBufferBytesArray(index).Buffer, secBufferBytesArray(index).BufferType)
'We will write out bits in the following order:
'int cbBuffer;
'int BufferType;
'pvBuffer;
'Note that we won't be releasing the memory allocated by ThisSecBuffer until we
'are disposed...
Dim currentOffset As Integer = index * Marshal.SizeOf(GetType(SecBuffer))
Marshal.WriteInt32(pBuffers, currentOffset, thisSecBuffer.cbBuffer)
Marshal.WriteInt32(pBuffers, currentOffset + Marshal.SizeOf(thisSecBuffer.cbBuffer), thisSecBuffer.BufferType)
Marshal.WriteIntPtr(pBuffers, currentOffset + Marshal.SizeOf(thisSecBuffer.cbBuffer) + Marshal.SizeOf(thisSecBuffer.BufferType), thisSecBuffer.pvBuffer)
Next
End Sub
Public Sub Dispose()
If pBuffers <> IntPtr.Zero Then
If cBuffers = 1 Then
Dim thisSecBuffer = CType(Marshal.PtrToStructure(pBuffers, GetType(SecBuffer)), SecBuffer)
thisSecBuffer.Dispose()
Else
For index As Integer = 0 To cBuffers - 1
'The bits were written out the following order:
'int cbBuffer;
'int BufferType;
'pvBuffer;
'What we need to do here is to grab a hold of the pvBuffer allocate by the individual
'SecBuffer and release it...
Dim currentOffset As Integer = index * Marshal.SizeOf(GetType(SecBuffer))
Dim secBufferpvBuffer As IntPtr = Marshal.ReadIntPtr(pBuffers, currentOffset + Marshal.SizeOf(GetType(Integer)) + Marshal.SizeOf(GetType(Integer)))
Marshal.FreeHGlobal(secBufferpvBuffer)
Next
End If
Marshal.FreeHGlobal(pBuffers)
pBuffers = IntPtr.Zero
End If
End Sub
Public Function GetSecBufferByteArray() As Byte()
Dim buffer As Byte() = Nothing
If pBuffers = IntPtr.Zero Then
Throw New InvalidOperationException("Object has already been disposed!!!")
End If
If cBuffers = 1 Then
Dim thisSecBuffer = CType(Marshal.PtrToStructure(pBuffers, GetType(SecBuffer)), SecBuffer)
If thisSecBuffer.cbBuffer > 0 Then
buffer = New Byte(thisSecBuffer.cbBuffer - 1) {}
Marshal.Copy(thisSecBuffer.pvBuffer, buffer, 0, thisSecBuffer.cbBuffer)
End If
Else
Dim bytesToAllocate As Integer = 0
Dim Index As Integer
For Index = 0 To cBuffers - 1
'The bits were written out the following order:
'int cbBuffer;
'int BufferType;
'pvBuffer;
'What we need to do here calculate the total number of bytes we need to copy...
Dim currentOffset As Integer = Index * Marshal.SizeOf(GetType(SecBuffer))
bytesToAllocate += Marshal.ReadInt32(pBuffers, currentOffset)
Next
buffer = New Byte(bytesToAllocate - 1) {}
Index = 0
Dim BufferIndex As Integer = 0
While Index < cBuffers
'The bits were written out the following order:
'int cbBuffer;
'int BufferType;
'pvBuffer;
'Now iterate over the individual buffers and put them together into a
'byte array...
Dim currentOffset As Integer = Index * Marshal.SizeOf(GetType(SecBuffer))
Dim bytesToCopy As Integer = Marshal.ReadInt32(pBuffers, currentOffset)
Dim secBufferpvBuffer As IntPtr = Marshal.ReadIntPtr(pBuffers, currentOffset + Marshal.SizeOf(GetType(Integer)) + Marshal.SizeOf(GetType(Integer)))
Marshal.Copy(secBufferpvBuffer, buffer, BufferIndex, bytesToCopy)
BufferIndex += bytesToCopy
Index += 1
End While
End If
Return (buffer)
End Function
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure SECURITY_INTEGER
Public LowPart As UInteger
Public HighPart As Integer
Public Sub New(ByVal dummy As Integer)
LowPart = 0
HighPart = 0
End Sub
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure SECURITY_HANDLE
Public LowPart As UInteger
Public HighPart As UInteger
Public Sub New(ByVal dummy As Integer)
LowPart = 0
HighPart = 0
End Sub
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure SecPkgContext_Sizes
Public cbMaxToken As UInteger
Public cbMaxSignature As UInteger
Public cbBlockSize As UInteger
Public cbSecurityTrailer As UInteger
End Structure
#End Region
<Serializable()> _
Public Class SspiException
Inherits ApplicationException
Private ReadOnly _errorCode As Integer
Public Sub New(ByVal message As String, ByVal errorCode As Integer)
MyBase.New(String.Format("{0}. Error Code = '{1:X}'.", message, errorCode))
_errorCode = errorCode
End Sub
Public ReadOnly Property ErrorCode() As Integer
Get
Return _errorCode
End Get
End Property
End Class
<Serializable()> _
Public Class SoapException
Inherits SystemException
Public Shared ReadOnly ClientFaultCode As XmlQualifiedName
Public Shared ReadOnly DetailElementName As XmlQualifiedName
Public Shared ReadOnly MustUnderstandFaultCode As XmlQualifiedName
Public Shared ReadOnly ServerFaultCode As XmlQualifiedName
Public Shared ReadOnly VersionMismatchFaultCode As XmlQualifiedName
Public Sub New()
End Sub
Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal innerException As Exception)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal subCode As SoapFaultSubCode)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal actor As String)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal actor As String, ByVal innerException As Exception)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal actor As String, ByVal detail As XmlNode)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal actor As String, ByVal detail As XmlNode, ByVal innerException As Exception)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal actor As String, ByVal role As String, ByVal detail As XmlNode, ByVal subCode As SoapFaultSubCode, _
ByVal innerException As Exception)
End Sub
Public Sub New(ByVal message As String, ByVal code As XmlQualifiedName, ByVal actor As String, ByVal role As String, ByVal lang As String, ByVal detail As XmlNode, _
ByVal subCode As SoapFaultSubCode, ByVal innerException As Exception)
End Sub
Public ReadOnly Property Actor() As String
Get
End Get
End Property
Public ReadOnly Property Code() As XmlQualifiedName
Get
End Get
End Property
Public ReadOnly Property Detail() As XmlNode
Get
End Get
End Property
<ComVisible(False)> _
Public ReadOnly Property Lang() As String
Get
End Get
End Property
<ComVisible(False)> _
Public ReadOnly Property Node() As String
Get
End Get
End Property
<ComVisible(False)> _
Public ReadOnly Property Role() As String
Get
End Get
End Property
<ComVisible(False)> _
Public ReadOnly Property SubCode() As SoapFaultSubCode
Get
End Get
End Property
Public Overrides Sub GetObjectData(info As SerializationInfo, context As StreamingContext)
End Sub
Public Shared Function IsClientFaultCode(ByVal code As XmlQualifiedName) As Boolean
End Function
Public Shared Function IsMustUnderstandFaultCode(ByVal code As XmlQualifiedName) As Boolean
End Function
Public Shared Function IsServerFaultCode(ByVal code As XmlQualifiedName) As Boolean
End Function
Public Shared Function IsVersionMismatchFaultCode(ByVal code As XmlQualifiedName) As Boolean
End Function
End Class
<Serializable()> _
Public Class SoapFaultSubCode
Public Sub New(ByVal code As XmlQualifiedName)
End Sub
Public Sub New(ByVal code As XmlQualifiedName, ByVal subCode As SoapFaultSubCode)
End Sub
Public ReadOnly Property Code() As XmlQualifiedName
Get
End Get
End Property
Public ReadOnly Property SubCode() As SoapFaultSubCode
Get
End Get
End Property
End Class
Public Class SSPIChallengeUnused
Inherits VimFault
Public Sub New()
End Sub
Public Property base64Token() As String
Get
Return m_base64Token
End Get
Set(ByVal value As String)
m_base64Token = value
End Set
End Property
Private m_base64Token As String
End Class[/code]