Added support for querying a credential's name.
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.DirectoryServices.AccountManagement;
|
using System.DirectoryServices.AccountManagement;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@@ -101,9 +102,33 @@ namespace NSspi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetName()
|
public string Name
|
||||||
{
|
{
|
||||||
return null;
|
get
|
||||||
|
{
|
||||||
|
NativeMethods.QueryNameAttribCarrier carrier = new NativeMethods.QueryNameAttribCarrier();
|
||||||
|
|
||||||
|
SecurityStatus status;
|
||||||
|
string name = null;
|
||||||
|
|
||||||
|
status = NativeMethods.QueryCredentialsAttribute_Name(
|
||||||
|
ref this.credHandle,
|
||||||
|
CredentialQueryAttrib.Names,
|
||||||
|
ref carrier
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( status == SecurityStatus.Success )
|
||||||
|
{
|
||||||
|
name = Marshal.PtrToStringUni( carrier.Name );
|
||||||
|
NativeMethods.FreeContextBuffer( carrier.Name );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new SSPIException( "Failed to query credential name", status );
|
||||||
|
}
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long CredentialHandle
|
public long CredentialHandle
|
||||||
|
|||||||
23
CredentialQueryAttrib.cs
Normal file
23
CredentialQueryAttrib.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NSspi
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
#define SECPKG_CRED_ATTR_NAMES 1
|
||||||
|
#define SECPKG_CRED_ATTR_SSI_PROVIDER 2
|
||||||
|
#define SECPKG_CRED_ATTR_KDC_PROXY_SETTINGS 3
|
||||||
|
#define SECPKG_CRED_ATTR_CERT 4
|
||||||
|
*/
|
||||||
|
|
||||||
|
public enum CredentialQueryAttrib : uint
|
||||||
|
{
|
||||||
|
Names = 1,
|
||||||
|
SsiProvider = 2,
|
||||||
|
KdcProxySettings = 3,
|
||||||
|
Cert = 4
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -46,6 +46,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Credential.cs" />
|
<Compile Include="Credential.cs" />
|
||||||
<Compile Include="CredentialPackage.cs" />
|
<Compile Include="CredentialPackage.cs" />
|
||||||
|
<Compile Include="CredentialQueryAttrib.cs" />
|
||||||
<Compile Include="CredentialType.cs" />
|
<Compile Include="CredentialType.cs" />
|
||||||
<Compile Include="CredentialUse.cs" />
|
<Compile Include="CredentialUse.cs" />
|
||||||
<Compile Include="NativeMethods.cs" />
|
<Compile Include="NativeMethods.cs" />
|
||||||
|
|||||||
@@ -73,5 +73,55 @@ namespace NSspi
|
|||||||
ref long credentialHandle
|
ref long credentialHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
SECURITY_STATUS SEC_Entry FreeContextBuffer(
|
||||||
|
_In_ PVOID pvContextBuffer
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
[DllImport(
|
||||||
|
"Secur32.dll",
|
||||||
|
EntryPoint = "FreeContextBuffer",
|
||||||
|
CallingConvention = CallingConvention.Winapi,
|
||||||
|
CharSet = CharSet.Unicode,
|
||||||
|
SetLastError = true
|
||||||
|
)]
|
||||||
|
public static extern SecurityStatus FreeContextBuffer( IntPtr buffer );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
SECURITY_STATUS SEC_Entry QueryCredentialsAttributes(
|
||||||
|
_In_ PCredHandle phCredential,
|
||||||
|
_In_ ULONG ulAttribute,
|
||||||
|
_Out_ PVOID pBuffer
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The overload of the QueryCredentialsAttribute method that is used for querying the name attribute.
|
||||||
|
/// In this call, it takes a void* to a structure that contains a wide char* pointer.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="credentialHandle"></param>
|
||||||
|
/// <param name="attributeName"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DllImport(
|
||||||
|
"Secur32.dll",
|
||||||
|
EntryPoint = "QueryCredentialsAttributes",
|
||||||
|
CallingConvention = CallingConvention.Winapi,
|
||||||
|
CharSet = CharSet.Unicode,
|
||||||
|
SetLastError = true
|
||||||
|
)]
|
||||||
|
public static extern SecurityStatus QueryCredentialsAttribute_Name(
|
||||||
|
ref long credentialHandle,
|
||||||
|
CredentialQueryAttrib attributeName,
|
||||||
|
ref QueryNameAttribCarrier name
|
||||||
|
);
|
||||||
|
|
||||||
|
[StructLayout( LayoutKind.Sequential )]
|
||||||
|
public struct QueryNameAttribCarrier
|
||||||
|
{
|
||||||
|
public IntPtr Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
Program.cs
17
Program.cs
@@ -10,9 +10,22 @@ namespace NSspi
|
|||||||
{
|
{
|
||||||
public static void Main( string[] args )
|
public static void Main( string[] args )
|
||||||
{
|
{
|
||||||
Credential cred = new Credential( SecurityPackage.Negotiate, CredentialType.Client );
|
Credential cred = null;
|
||||||
cred.Dispose();
|
try
|
||||||
|
{
|
||||||
|
cred = new Credential( SecurityPackage.Negotiate, CredentialType.Client );
|
||||||
|
|
||||||
|
string name = cred.GetName();
|
||||||
|
Console.Out.WriteLine( name );
|
||||||
|
Console.Out.Flush();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if ( cred != null )
|
||||||
|
{
|
||||||
|
cred.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user