1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Security;
6 using System.Runtime.InteropServices;
7 
8 namespace System.DirectoryServices.ActiveDirectory
9 {
10 #pragma warning disable BCL0015 // CoreFxPort
11 
12     /*typedef struct _DOMAIN_CONTROLLER_INFO {
13 		LPTSTR DomainControllerName;
14 		LPTSTR DomainControllerAddress;
15 		ULONG DomainControllerAddressType;
16 		GUID DomainGuid;
17 		LPTSTR DomainName;
18 		LPTSTR DnsForestName;
19 		ULONG Flags;
20 		LPTSTR DcSiteName;
21 		LPTSTR ClientSiteName;
22 	} DOMAIN_CONTROLLER_INFO, *PDOMAIN_CONTROLLER_INFO; */
23     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
24     internal sealed class DomainControllerInfo
25     {
26         public string DomainControllerName;
27         public string DomainControllerAddress;
28         public int DomainControllerAddressType;
29         public Guid DomainGuid;
30         public string DomainName;
31         public string DnsForestName;
32         public int Flags;
33         public string DcSiteName;
34         public string ClientSiteName;
35     }
36 
37     /*typedef struct {
38 	 	LPTSTR NetbiosName;
39 		LPTSTR DnsHostName;
40 		LPTSTR SiteName;
41 		LPTSTR SiteObjectName;
42 		LPTSTR ComputerObjectName;
43 		LPTSTR ServerObjectName;
44 		LPTSTR NtdsaObjectName;
45 		BOOL fIsPdc;
46 		BOOL fDsEnabled;
47 		BOOL fIsGc;
48 		GUID SiteObjectGuid;
49 		GUID ComputerObjectGuid;
50 		GUID ServerObjectGuid;
51 		GUID NtdsDsaObjectGuid;
52 	} DS_DOMAIN_CONTROLLER_INFO_2, *PDS_DOMAIN_CONTROLLER_INFO_2;*/
53     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
54     internal sealed class DsDomainControllerInfo2
55     {
56         public string netBiosName;
57         public string dnsHostName;
58         public string siteName;
59         public string siteObjectName;
60         public string computerObjectName;
61         public string serverObjectName;
62         public string ntdsaObjectName;
63         public bool isPdc;
64         public bool dsEnabled;
65         public bool isGC;
66         public Guid siteObjectGuid;
67         public Guid computerObjectGuid;
68         public Guid serverObjectGuid;
69         public Guid ntdsDsaObjectGuid;
70     }
71 
72     /*typedef struct {
73 		LPTSTR NetbiosName;
74 		LPTSTR DnsHostName;
75 		LPTSTR SiteName;
76 		LPTSTR SiteObjectName;
77 		LPTSTR ComputerObjectName;
78 		LPTSTR ServerObjectName;
79 		LPTSTR NtdsaObjectName;
80 		BOOL fIsPdc;
81 		BOOL fDsEnabled;
82 		BOOL fIsGc;
83 		BOOL fIsRodc;
84 		GUID SiteObjectGuid;
85 		GUID ComputerObjectGuid;
86 		GUID ServerObjectGuid;
87 		GUID NtdsDsaObjectGuid;
88 	} DS_DOMAIN_CONTROLLER_INFO_3, *PDS_DOMAIN_CONTROLLER_INFO_3;*/
89     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
90     internal sealed class DsDomainControllerInfo3
91     {
92         public string netBiosName;
93         public string dnsHostName;
94         public string siteName;
95         public string siteObjectName;
96         public string computerObjectName;
97         public string serverObjectName;
98         public string ntdsaObjectName;
99         public bool isPdc;
100         public bool dsEnabled;
101         public bool isGC;
102         public bool isRodc;
103         public Guid siteObjectGuid;
104         public Guid computerObjectGuid;
105         public Guid serverObjectGuid;
106         public Guid ntdsDsaObjectGuid;
107     }
108 
109     /*typedef struct {
110 		DWORD cItems;
111 		PDS_NAME_RESULT_ITEM rItems;
112 	} DS_NAME_RESULT, *PDS_NAME_RESULT;*/
113     [StructLayout(LayoutKind.Sequential)]
114     internal sealed class DsNameResult
115     {
116         public int itemCount;
117         public IntPtr items;
118     }
119 
120     /*typedef struct  {
121 		DWORD status;
122 		LPTSTR pDomain;
123 		LPTSTR pName;
124 	} DS_NAME_RESULT_ITEM, *PDS_NAME_RESULT_ITEM;*/
125     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
126     internal sealed class DsNameResultItem
127     {
128         public int status;
129         public string domain;
130         public string name;
131     }
132 
133     /*typedef struct _DnsRecord {
134 		struct _DnsRecord * pNext;
135 		LPTSTR              pName;
136 		WORD                wType;
137 		WORD                wDataLength; // Not referenced for DNS record
138 		//types defined above.
139 		union {
140 			DWORD               DW;      // flags as DWORD
141 			DNS_RECORD_FLAGS    S;       // flags as structure
142 		} Flags;
143 
144 		DWORD               dwTtl;
145 		DWORD               dwReserved;
146 
147 		// Record Data
148 		union {
149 			DNS_A_DATA      A;
150 			DNS_SOA_DATA    SOA, Soa;
151 			DNS_PTR_DATA    PTR, Ptr,
152 							NS, Ns,
153 							CNAME, Cname,
154 							MB, Mb,
155 							MD, Md,
156 							MF, Mf,
157 							MG, Mg,
158 							MR, Mr;
159 			DNS_MINFO_DATA  MINFO, Minfo,
160 							RP, Rp;
161 			DNS_MX_DATA     MX, Mx,
162 							AFSDB, Afsdb,
163 							RT, Rt;
164 			DNS_TXT_DATA    HINFO, Hinfo,
165 							ISDN, Isdn,
166 							TXT, Txt,
167 							X25;
168 			DNS_NULL_DATA   Null;
169 			DNS_WKS_DATA    WKS, Wks;
170 			DNS_AAAA_DATA   AAAA;
171 			DNS_KEY_DATA    KEY, Key;
172 			DNS_SIG_DATA    SIG, Sig;
173 			DNS_ATMA_DATA   ATMA, Atma;
174 			DNS_NXT_DATA    NXT, Nxt;
175 			DNS_SRV_DATA    SRV, Srv;
176 			DNS_TKEY_DATA   TKEY, Tkey;
177 			DNS_TSIG_DATA   TSIG, Tsig;
178 			DNS_WINS_DATA   WINS, Wins;
179 			DNS_WINSR_DATA  WINSR, WinsR, NBSTAT, Nbstat;
180 		} Data;
181 	}DNS_RECORD, *PDNS_RECORD;*/
182     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
183     internal sealed class DnsRecord
184     {
185         public IntPtr next;
186         public string name;
187         public short type;
188         public short dataLength;
189         public int flags;
190         public int ttl;
191         public int reserved;
192         public DnsSrvData data;
193     }
194 
195     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
196     internal sealed class PartialDnsRecord
197     {
198         public IntPtr next;
199         public string name;
200         public short type;
201         public short dataLength;
202         public int flags;
203         public int ttl;
204         public int reserved;
205         public IntPtr data;
206     }
207 
208     /*typedef struct {
209 		LPTSTR      pNameTarget;
210 		WORD        wPriority;
211 		WORD        wWeight;
212 		WORD        wPort;
213 		WORD        Pad;            // keep ptrs DWORD aligned
214 	}DNS_SRV_DATA, *PDNS_SRV_DATA;*/
215     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
216     internal sealed class DnsSrvData
217     {
218         public string targetName;
219         public short priority;
220         public short weight;
221         public short port;
222         public short pad;
223     }
224 
225     /*typedef struct _OSVERSIONINFOEX {
226 		DWORD dwOSVersionInfoSize;
227 		DWORD dwMajorVersion;
228 		DWORD dwMinorVersion;
229 		DWORD dwBuildNumber;
230 		DWORD dwPlatformId;
231 		TCHAR szCSDVersion[ 128 ];
232 		WORD wServicePackMajor;
233 		WORD wServicePackMinor;
234 		WORD wSuiteMask;
235 		BYTE wProductType;
236 		BYTE wReserved;
237 		} OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;*/
238     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
239     internal sealed class OSVersionInfoEx
240     {
OSVersionInfoEx()241         public OSVersionInfoEx()
242         {
243             osVersionInfoSize = (int)Marshal.SizeOf(this);
244         }
245 
246         // The OSVersionInfoSize field must be set to Marshal.SizeOf(this)
247         public int osVersionInfoSize = 0;
248         public int majorVersion = 0;
249         public int minorVersion = 0;
250         public int buildNumber = 0;
251         public int platformId = 0;
252         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
253         public string csdVersion = null;
254         public short servicePackMajor = 0;
255         public short servicePackMinor = 0;
256         public short suiteMask = 0;
257         public byte productType = 0;
258         public byte reserved = 0;
259     }
260 
261     /*typedef struct _LUID {
262     		DWORD LowPart;
263     		LONG HighPart;
264 	} LUID, *PLUID;*/
265     [StructLayout(LayoutKind.Sequential)]
266     internal sealed class LUID
267     {
268         public int LowPart;
269         public int HighPart;
270     }
271 
272     /*typedef struct _NEGOTIATE_CALLER_NAME_REQUEST {
273     		ULONG       MessageType ;
274     		LUID        LogonId ;
275 	} NEGOTIATE_CALLER_NAME_REQUEST, *PNEGOTIATE_CALLER_NAME_REQUEST ;*/
276     [StructLayout(LayoutKind.Sequential)]
277     internal sealed class NegotiateCallerNameRequest
278     {
279         public int messageType;
280         public LUID logonId;
281     }
282 
283     /*typedef struct _NEGOTIATE_CALLER_NAME_RESPONSE {
284     		ULONG       MessageType ;
285     		PWSTR       CallerName ;
286 		} NEGOTIATE_CALLER_NAME_RESPONSE, * PNEGOTIATE_CALLER_NAME_RESPONSE ;*/
287     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
288     internal sealed class NegotiateCallerNameResponse
289     {
290         public int messageType;
291         public string callerName;
292     }
293 
294     internal sealed class NativeMethods
295     {
296         // disable public constructor
NativeMethods()297         private NativeMethods() { }
298 
299         internal const int VER_PLATFORM_WIN32_NT = 2;
300         internal const int ERROR_INVALID_DOMAIN_NAME_FORMAT = 1212;
301         internal const int ERROR_NO_SUCH_DOMAIN = 1355;
302         internal const int ERROR_NOT_ENOUGH_MEMORY = 8;
303         internal const int ERROR_INVALID_FLAGS = 1004;
304         internal const int DS_NAME_NO_ERROR = 0;
305         internal const int ERROR_NO_MORE_ITEMS = 259;
306         internal const int ERROR_FILE_MARK_DETECTED = 1101;
307         internal const int DNS_ERROR_RCODE_NAME_ERROR = 9003;
308         internal const int ERROR_NO_SUCH_LOGON_SESSION = 1312;
309 
310         internal const int DS_NAME_FLAG_SYNTACTICAL_ONLY = 1;
311         internal const int DS_FQDN_1779_NAME = 1;
312         internal const int DS_CANONICAL_NAME = 7;
313         internal const int DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING = 6;
314 
315         internal const int STATUS_QUOTA_EXCEEDED = unchecked((int)0xC0000044);
316 
317         /*DWORD DsGetDcName(
318 				LPCTSTR ComputerName,
319 				LPCTSTR DomainName,
320 				GUID* DomainGuid,
321 				LPCTSTR SiteName,
322 				ULONG Flags,
323 				PDOMAIN_CONTROLLER_INFO* DomainControllerInfo
324 				);*/
325         [DllImport("Netapi32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "DsGetDcNameW", CharSet = CharSet.Unicode)]
DsGetDcName( [In] string computerName, [In] string domainName, [In] IntPtr domainGuid, [In] string siteName, [In] int flags, [Out] out IntPtr domainControllerInfo)326         internal static extern int DsGetDcName(
327             [In] string computerName,
328             [In] string domainName,
329             [In] IntPtr domainGuid,
330             [In] string siteName,
331             [In] int flags,
332             [Out] out IntPtr domainControllerInfo);
333 
334         /* DWORD WINAPI DsGetDcOpen(
335 						 LPCTSTR DnsName,
336 						 ULONG OptionFlags,
337 						 LPCTSTR SiteName,
338 						 GUID* DomainGuid,
339 						 LPCTSTR DnsForestName,
340 						 ULONG DcFlags,
341 						 PHANDLE RetGetDcContext
342 						 );*/
343         [DllImport("Netapi32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "DsGetDcOpenW", CharSet = CharSet.Unicode)]
DsGetDcOpen( [In] string dnsName, [In] int optionFlags, [In] string siteName, [In] IntPtr domainGuid, [In] string dnsForestName, [In] int dcFlags, [Out] out IntPtr retGetDcContext)344         internal static extern int DsGetDcOpen(
345             [In] string dnsName,
346             [In] int optionFlags,
347             [In] string siteName,
348             [In] IntPtr domainGuid,
349             [In] string dnsForestName,
350             [In] int dcFlags,
351             [Out] out IntPtr retGetDcContext);
352 
353         /*DWORD WINAPI DsGetDcNext(
354 						HANDLE GetDcContextHandle,
355 						PULONG SockAddressCount,
356 						LPSOCKET_ADDRESS* SockAddresses,
357 						LPTSTR* DnsHostName
358 						);*/
359         [DllImport("Netapi32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "DsGetDcNextW", CharSet = CharSet.Unicode)]
DsGetDcNext( [In] IntPtr getDcContextHandle, [In, Out] ref IntPtr sockAddressCount, [Out] out IntPtr sockAdresses, [Out] out IntPtr dnsHostName)360         internal static extern int DsGetDcNext(
361             [In] IntPtr getDcContextHandle,
362             [In, Out] ref IntPtr sockAddressCount,
363             [Out] out IntPtr sockAdresses,
364             [Out] out IntPtr dnsHostName);
365 
366         /*void WINAPI DsGetDcClose(
367 						HANDLE GetDcContextHandle
368 						);*/
369         [DllImport("Netapi32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "DsGetDcCloseW", CharSet = CharSet.Unicode)]
DsGetDcClose( [In] IntPtr getDcContextHandle)370         internal static extern void DsGetDcClose(
371             [In] IntPtr getDcContextHandle);
372 
373         /*NET_API_STATUS NetApiBufferFree(
374 				LPVOID Buffer
375 				);*/
376         [DllImport("Netapi32.dll")]
NetApiBufferFree( [In] IntPtr buffer)377         internal static extern int NetApiBufferFree(
378             [In] IntPtr buffer);
379 
380         /*DWORD DsMakePasswordCredentials(
381 			LPTSTR User,
382 			LPTSTR Domain,
383 			LPTSTR Password,
384 			RPC_AUTH_IDENTITY_HANDLE* pAuthIdentity
385 			);*/
386 
DsMakePasswordCredentials( [MarshalAs(UnmanagedType.LPWStr)] string user, [MarshalAs(UnmanagedType.LPWStr)] string domain, [MarshalAs(UnmanagedType.LPWStr)] string password, [Out] out IntPtr authIdentity)387         internal delegate int DsMakePasswordCredentials(
388       [MarshalAs(UnmanagedType.LPWStr)] string user,
389       [MarshalAs(UnmanagedType.LPWStr)] string domain,
390       [MarshalAs(UnmanagedType.LPWStr)] string password,
391       [Out] out IntPtr authIdentity);
392 
393         /*VOID DsFreePasswordCredentials(
394 			RPC_AUTH_IDENTITY_HANDLE AuthIdentity
395 			);*/
DsFreePasswordCredentials( [In] IntPtr authIdentity)396         internal delegate void DsFreePasswordCredentials(
397             [In] IntPtr authIdentity);
398 
399         /*DWORD DsBindWithCred(
400 			TCHAR* DomainController,
401 			TCHAR* DnsDomainName,
402 			RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
403 			HANDLE* phDS
404 			);*/
DsBindWithCred( [MarshalAs(UnmanagedType.LPWStr)] string domainController, [MarshalAs(UnmanagedType.LPWStr)] string dnsDomainName, [In] IntPtr authIdentity, [Out] out IntPtr handle)405         internal delegate int DsBindWithCred(
406             [MarshalAs(UnmanagedType.LPWStr)] string domainController,
407             [MarshalAs(UnmanagedType.LPWStr)] string dnsDomainName,
408             [In] IntPtr authIdentity,
409             [Out] out IntPtr handle);
410 
411         /*DWORD DsUnBind(
412 			HANDLE* phDS
413 			);*/
DsUnBind( [In] ref IntPtr handle)414         internal delegate int DsUnBind(
415             [In] ref IntPtr handle);
416 
417         /*DWORD DsGetDomainControllerInfo(
418 			HANDLE hDs,
419 			LPTSTR DomainName,
420 			DWORD InfoLevel,
421 			DWORD* pcOut,
422 			VOID** ppInfo
423 			);*/
DsGetDomainControllerInfo( [In] IntPtr handle, [MarshalAs(UnmanagedType.LPWStr)] string domainName, [In] int infoLevel, [Out] out int dcCount, [Out] out IntPtr dcInfo)424         internal delegate int DsGetDomainControllerInfo(
425             [In] IntPtr handle,
426             [MarshalAs(UnmanagedType.LPWStr)] string domainName,
427             [In] int infoLevel,
428             [Out] out int dcCount,
429             [Out] out IntPtr dcInfo);
430 
431         internal const int DsDomainControllerInfoLevel2 = 2;
432         internal const int DsDomainControllerInfoLevel3 = 3;
433 
434         /*VOID DsFreeDomainControllerInfo(
435 			DWORD InfoLevel,
436 			DWORD cInfo,
437 			VOID* pInfo
438 			);*/
DsFreeDomainControllerInfo( [In] int infoLevel, [In] int dcInfoListCount, [In] IntPtr dcInfoList)439         internal delegate void DsFreeDomainControllerInfo(
440             [In] int infoLevel,
441             [In] int dcInfoListCount,
442             [In] IntPtr dcInfoList);
443 
444         internal const int DsNameNoError = 0;
445 
446         /*DWORD DsListSites(
447 			HANDLE hDs,
448 			PDS_NAME_RESULT* ppSites
449 			);*/
DsListSites( [In] IntPtr dsHandle, [Out] out IntPtr sites)450         internal delegate int DsListSites(
451             [In] IntPtr dsHandle,
452             [Out] out IntPtr sites);
453 
454         /*DWORD DsListRoles(
455 			HANDLE hDs,
456 			PDS_NAME_RESULTW* ppRoles
457 			);*/
DsListRoles( [In] IntPtr dsHandle, [Out] out IntPtr roles)458         internal delegate int DsListRoles(
459             [In] IntPtr dsHandle,
460             [Out] out IntPtr roles);
461 
462         /*DWORD GetLastError(VOID)*/
463         [DllImport("Kernel32.dll")]
GetLastError()464         internal static extern int GetLastError();
465 
466         internal const int DnsSrvData = 33;
467         internal const int DnsQueryBypassCache = 8;
468 
469         /*DNS_STATUS WINAPI DnsQuery (
470 			LPSTR lpstrName,
471 			WORD wType,
472 			DWORD fOptions,
473 			PIP4_ARRAY aipServers,
474 			PDNS_RECORD *ppQueryResultsSet,
475 			PVOID *pReserved
476 			);*/
477         [DllImport("Dnsapi.dll", EntryPoint = "DnsQuery_W", CharSet = CharSet.Unicode)]
DnsQuery( [In] string recordName, [In] short recordType, [In] int options, [In] IntPtr servers, [Out] out IntPtr dnsResultList, [Out] IntPtr reserved)478         internal static extern int DnsQuery(
479             [In] string recordName,
480             [In] short recordType,
481             [In] int options,
482             [In] IntPtr servers,
483             [Out] out IntPtr dnsResultList,
484             [Out] IntPtr reserved);
485 
486         /*VOID WINAPI DnsRecordListFree(
487 			PDNS_RECORD pRecordList,
488 			DNS_FREE_TYPE FreeType
489 			);*/
490         [DllImport("Dnsapi.dll", CharSet = CharSet.Unicode)]
DnsRecordListFree( [In] IntPtr dnsResultList, [In] bool dnsFreeType)491         internal static extern void DnsRecordListFree(
492             [In] IntPtr dnsResultList,
493             [In] bool dnsFreeType);
494 
495         /*BOOL GetVersionEx(
496   			LPOSVERSIONINFO lpVersionInfo
497 			);*/
498         [DllImport("Kernel32.dll", EntryPoint = "GetVersionExW", CharSet = CharSet.Unicode, SetLastError = true)]
GetVersionEx( [In, Out] OSVersionInfoEx ver)499         internal static extern bool GetVersionEx(
500                 [In, Out] OSVersionInfoEx ver);
501 
502         /*DWORD DsCrackNames(
503 			HANDLE hDS,
504 			DS_NAME_FLAGS flags,
505 			DS_NAME_FORMAT formatOffered,
506 			DS_NAME_FORMAT formatDesired,
507 			DWORD cNames,
508 			LPTSTR* rpNames,
509 			PDS_NAME_RESULT* ppResult
510 			);*/
DsCrackNames( [In] IntPtr hDS, [In] int flags, [In] int formatOffered, [In] int formatDesired, [In] int nameCount, [In] IntPtr names, [Out] out IntPtr results)511         internal delegate int DsCrackNames(
512             [In] IntPtr hDS,
513             [In] int flags,
514             [In] int formatOffered,
515             [In] int formatDesired,
516             [In] int nameCount,
517             [In] IntPtr names,
518             [Out] out IntPtr results);
519 
520         /*NTSTATUS LsaConnectUntrusted(
521  			 PHANDLE LsaHandle
522 			);*/
523         [DllImport("Secur32.dll")]
LsaConnectUntrusted( [Out] out LsaLogonProcessSafeHandle lsaHandle)524         internal static extern int LsaConnectUntrusted(
525              [Out] out LsaLogonProcessSafeHandle lsaHandle);
526 
527         internal const int NegGetCallerName = 1;
528 
529         /*NTSTATUS LsaCallAuthenticationPackage(
530 			  HANDLE LsaHandle,
531 			  ULONG AuthenticationPackage,
532 			  PVOID ProtocolSubmitBuffer,
533 			  ULONG SubmitBufferLength,
534 			  PVOID* ProtocolReturnBuffer,
535 			  PULONG ReturnBufferLength,
536 			  PNTSTATUS ProtocolStatus
537 			);*/
538         [DllImport("Secur32.dll")]
LsaCallAuthenticationPackage( [In] LsaLogonProcessSafeHandle lsaHandle, [In] int authenticationPackage, [In] NegotiateCallerNameRequest protocolSubmitBuffer, [In] int submitBufferLength, [Out] out IntPtr protocolReturnBuffer, [Out] out int returnBufferLength, [Out] out int protocolStatus)539         internal static extern int LsaCallAuthenticationPackage(
540             [In] LsaLogonProcessSafeHandle lsaHandle,
541             [In] int authenticationPackage,
542             [In] NegotiateCallerNameRequest protocolSubmitBuffer,
543             [In] int submitBufferLength,
544             [Out] out IntPtr protocolReturnBuffer,
545             [Out] out int returnBufferLength,
546             [Out] out int protocolStatus);
547 
548         /*NTSTATUS LsaFreeReturnBuffer(
549   			PVOID Buffer
550 			);*/
551         [DllImport("Secur32.dll")]
LsaFreeReturnBuffer( [In] IntPtr buffer)552         internal static extern uint LsaFreeReturnBuffer(
553             [In] IntPtr buffer);
554 
555         /*NTSTATUS LsaDeregisterLogonProcess(
556   			HANDLE LsaHandle
557 			);*/
558         [DllImport("Secur32.dll")]
LsaDeregisterLogonProcess( [In] IntPtr lsaHandle)559         internal static extern int LsaDeregisterLogonProcess(
560             [In] IntPtr lsaHandle);
561 
562         /*int CompareString(LCID Locale,
563 			DWORD dwCmpFlags,
564 			DWORD lpString1,
565 			DWORD cchCount1,
566 			DWORD lpString2,
567 			DWORD cchCount2
568 			);*/
569         [DllImport("Kernel32.dll", EntryPoint = "CompareStringW", CharSet = CharSet.Unicode, SetLastError = true)]
CompareString( [In] uint locale, [In] uint dwCmpFlags, [In] IntPtr lpString1, [In] int cchCount1, [In] IntPtr lpString2, [In] int cchCount2)570         internal static extern int CompareString(
571             [In] uint locale,
572             [In] uint dwCmpFlags,
573             [In] IntPtr lpString1,
574             [In] int cchCount1,
575             [In] IntPtr lpString2,
576             [In] int cchCount2);
577 
578         [DllImport("advapi32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "LsaNtStatusToWinError", CharSet = CharSet.Unicode)]
LsaNtStatusToWinError(int ntStatus)579         internal static extern int LsaNtStatusToWinError(int ntStatus);
580     }
581 
582     internal sealed class NativeComInterfaces
583     {
584         /*typedef enum {
585 		   ADS_SETTYPE_FULL=1,
586 		   ADS_SETTYPE_PROVIDER=2,
587 		   ADS_SETTYPE_SERVER=3,
588 		   ADS_SETTYPE_DN=4
589 		} ADS_SETTYPE_ENUM;
590 
591 		typedef enum {
592 		   ADS_FORMAT_WINDOWS=1,
593 		   ADS_FORMAT_WINDOWS_NO_SERVER=2,
594 		   ADS_FORMAT_WINDOWS_DN=3,
595 		   ADS_FORMAT_WINDOWS_PARENT=4,
596 		   ADS_FORMAT_X500=5,
597 		   ADS_FORMAT_X500_NO_SERVER=6,
598 		   ADS_FORMAT_X500_DN=7,
599 		   ADS_FORMAT_X500_PARENT=8,
600 		   ADS_FORMAT_SERVER=9,
601 		   ADS_FORMAT_PROVIDER=10,
602 		   ADS_FORMAT_LEAF=11
603 		} ADS_FORMAT_ENUM;
604 
605 		typedef enum {
606 		   ADS_ESCAPEDMODE_DEFAULT=1,
607 		   ADS_ESCAPEDMODE_ON=2,
608 		   ADS_ESCAPEDMODE_OFF=3,
609 		   ADS_ESCAPEDMODE_OFF_EX=4
610 		} ADS_ESCAPE_MODE_ENUM;*/
611 
612         internal const int ADS_SETTYPE_DN = 4;
613         internal const int ADS_FORMAT_X500_DN = 7;
614         internal const int ADS_ESCAPEDMODE_ON = 2;
615         internal const int ADS_ESCAPEDMODE_OFF_EX = 4;
616         internal const int ADS_FORMAT_LEAF = 11;
617 
618         //
619         // Pathname as a co-class that implements the IAdsPathname interface
620         //
621         [ComImport, Guid("080d0d78-f421-11d0-a36e-00c04fb950dc")]
622         internal class Pathname
623         {
624         }
625 
626         [ComImport, Guid("D592AED4-F420-11D0-A36E-00C04FB950DC")]
627         internal interface IAdsPathname
628         {
629             // HRESULT Set([in] BSTR bstrADsPath,  [in] long lnSetType);
Set([In, MarshalAs(UnmanagedType.BStr)] string bstrADsPath, [In, MarshalAs(UnmanagedType.U4)] int lnSetType)630             int Set([In, MarshalAs(UnmanagedType.BStr)] string bstrADsPath, [In, MarshalAs(UnmanagedType.U4)] int lnSetType);
631 
632             // HRESULT SetDisplayType([in] long lnDisplayType);
SetDisplayType([In, MarshalAs(UnmanagedType.U4)] int lnDisplayType)633             int SetDisplayType([In, MarshalAs(UnmanagedType.U4)] int lnDisplayType);
634 
635             // HRESULT Retrieve([in] long lnFormatType,  [out, retval] BSTR* pbstrADsPath);
636             [return: MarshalAs(UnmanagedType.BStr)]
Retrieve([In, MarshalAs(UnmanagedType.U4)] int lnFormatType)637             string Retrieve([In, MarshalAs(UnmanagedType.U4)] int lnFormatType);
638 
639             // HRESULT GetNumElements([out, retval] long* plnNumPathElements);
640             [return: MarshalAs(UnmanagedType.U4)]
GetNumElements()641             int GetNumElements();
642 
643             // HRESULT GetElement([in]  long lnElementIndex,  [out, retval] BSTR* pbstrElement);
644             [return: MarshalAs(UnmanagedType.BStr)]
GetElement([In, MarshalAs(UnmanagedType.U4)] int lnElementIndex)645             string GetElement([In, MarshalAs(UnmanagedType.U4)] int lnElementIndex);
646 
647             // HRESULT AddLeafElement([in] BSTR bstrLeafElement);
AddLeafElement([In, MarshalAs(UnmanagedType.BStr)] string bstrLeafElement)648             void AddLeafElement([In, MarshalAs(UnmanagedType.BStr)] string bstrLeafElement);
649 
650             // HRESULT RemoveLeafElement();
RemoveLeafElement()651             void RemoveLeafElement();
652 
653             // HRESULT CopyPath([out, retval] IDispatch** ppAdsPath);
654             [return: MarshalAs(UnmanagedType.Interface)]
CopyPath()655             object CopyPath();
656 
657             // HRESULT GetEscapedElement([in] long lnReserved, [in] BSTR bstrInStr, [out, retval] BSTR*  pbstrOutStr );
658             [return: MarshalAs(UnmanagedType.BStr)]
GetEscapedElement([In, MarshalAs(UnmanagedType.U4)] int lnReserved, [In, MarshalAs(UnmanagedType.BStr)] string bstrInStr)659             string GetEscapedElement([In, MarshalAs(UnmanagedType.U4)] int lnReserved, [In, MarshalAs(UnmanagedType.BStr)] string bstrInStr);
660 
661             int EscapedMode
662             {
663                 get;
664                 set;
665             }
666         }
667 
668         [ComImport, Guid("C8F93DD3-4AE0-11CF-9E73-00AA004A5691")]
669         internal interface IAdsProperty
670         {
671             //
672             // Need to also include the IAds interface definition here
673             //
674 
675             string Name
676             {
677                 [return: MarshalAs(UnmanagedType.BStr)]
678                 get;
679             }
680 
681             string Class
682             {
683                 [return: MarshalAs(UnmanagedType.BStr)]
684                 get;
685             }
686 
687             string GUID
688             {
689                 [return: MarshalAs(UnmanagedType.BStr)]
690                 get;
691             }
692 
693             string ADsPath
694             {
695                 [return: MarshalAs(UnmanagedType.BStr)]
696                 get;
697             }
698 
699             string Parent
700             {
701                 [return: MarshalAs(UnmanagedType.BStr)]
702                 get;
703             }
704 
705             string Schema
706             {
707                 [return: MarshalAs(UnmanagedType.BStr)]
708                 get;
709             }
710 
GetInfo()711             void GetInfo();
712 
SetInfo()713             void SetInfo();
714 
Get([In, MarshalAs(UnmanagedType.BStr)] string bstrName)715             Object Get([In, MarshalAs(UnmanagedType.BStr)] string bstrName);
716 
Put([In, MarshalAs(UnmanagedType.BStr)] string bstrName, [In] Object vProp)717             void Put([In, MarshalAs(UnmanagedType.BStr)] string bstrName,
718                         [In] Object vProp);
719 
GetEx([In, MarshalAs(UnmanagedType.BStr)] String bstrName)720             Object GetEx([In, MarshalAs(UnmanagedType.BStr)] String bstrName);
721 
PutEx([In, MarshalAs(UnmanagedType.U4)] int lnControlCode, [In, MarshalAs(UnmanagedType.BStr)] string bstrName, [In] Object vProp)722             void PutEx([In, MarshalAs(UnmanagedType.U4)] int lnControlCode,
723                         [In, MarshalAs(UnmanagedType.BStr)] string bstrName,
724                         [In] Object vProp);
725 
GetInfoEx([In] Object vProperties, [In, MarshalAs(UnmanagedType.U4)] int lnReserved)726             void GetInfoEx([In] Object vProperties,
727                         [In, MarshalAs(UnmanagedType.U4)] int lnReserved);
728 
729             //
730             // IAdsProperty definition starts here
731             //
732 
733             string OID
734             {
735                 [return: MarshalAs(UnmanagedType.BStr)]
736                 get;
737                 [param: MarshalAs(UnmanagedType.BStr)]
738                 set;
739             }
740 
741             string Syntax
742             {
743                 [return: MarshalAs(UnmanagedType.BStr)]
744                 get;
745                 [param: MarshalAs(UnmanagedType.BStr)]
746                 set;
747             }
748 
749             int MaxRange
750             {
751                 [return: MarshalAs(UnmanagedType.U4)]
752                 get;
753                 [param: MarshalAs(UnmanagedType.U4)]
754                 set;
755             }
756 
757             int MinRange
758             {
759                 [return: MarshalAs(UnmanagedType.U4)]
760                 get;
761                 [param: MarshalAs(UnmanagedType.U4)]
762                 set;
763             }
764 
765             bool MultiValued
766             {
767                 get;
768                 set;
769             }
Qualifiers()770             object Qualifiers();
771         }
772 
773         [ComImport, Guid("C8F93DD0-4AE0-11CF-9E73-00AA004A5691")]
774         internal interface IAdsClass
775         {
776             //
777             // Need to also include the IAds interface definition here
778             //
779 
780             string Name
781             {
782                 [return: MarshalAs(UnmanagedType.BStr)]
783                 get;
784             }
785 
786             string Class
787             {
788                 [return: MarshalAs(UnmanagedType.BStr)]
789                 get;
790             }
791 
792             string GUID
793             {
794                 [return: MarshalAs(UnmanagedType.BStr)]
795                 get;
796             }
797 
798             string ADsPath
799             {
800                 [return: MarshalAs(UnmanagedType.BStr)]
801                 get;
802             }
803 
804             string Parent
805             {
806                 [return: MarshalAs(UnmanagedType.BStr)]
807                 get;
808             }
809 
810             string Schema
811             {
812                 [return: MarshalAs(UnmanagedType.BStr)]
813                 get;
814             }
815 
GetInfo()816             void GetInfo();
817 
SetInfo()818             void SetInfo();
819 
Get([In, MarshalAs(UnmanagedType.BStr)] string bstrName)820             Object Get([In, MarshalAs(UnmanagedType.BStr)] string bstrName);
821 
Put([In, MarshalAs(UnmanagedType.BStr)] string bstrName, [In] Object vProp)822             void Put([In, MarshalAs(UnmanagedType.BStr)] string bstrName,
823                         [In] Object vProp);
824 
GetEx([In, MarshalAs(UnmanagedType.BStr)] String bstrName)825             Object GetEx([In, MarshalAs(UnmanagedType.BStr)] String bstrName);
826 
PutEx([In, MarshalAs(UnmanagedType.U4)] int lnControlCode, [In, MarshalAs(UnmanagedType.BStr)] string bstrName, [In] Object vProp)827             void PutEx([In, MarshalAs(UnmanagedType.U4)] int lnControlCode,
828                         [In, MarshalAs(UnmanagedType.BStr)] string bstrName,
829                         [In] Object vProp);
830 
GetInfoEx([In] Object vProperties, [In, MarshalAs(UnmanagedType.U4)] int lnReserved)831             void GetInfoEx([In] Object vProperties,
832                         [In, MarshalAs(UnmanagedType.U4)] int lnReserved);
833 
834             //
835             // IAdsClass definition starts here
836             //
837 
838             string PrimaryInterface
839             {
840                 [return: MarshalAs(UnmanagedType.BStr)]
841                 get;
842             }
843 
844             string CLSID
845             {
846                 [return: MarshalAs(UnmanagedType.BStr)]
847                 get;
848                 [param: MarshalAs(UnmanagedType.BStr)]
849                 set;
850             }
851 
852             string OID
853             {
854                 [return: MarshalAs(UnmanagedType.BStr)]
855                 get;
856                 [param: MarshalAs(UnmanagedType.BStr)]
857                 set;
858             }
859 
860             bool Abstract { get; set; }
861 
862             bool Auxiliary { get; set; }
863 
864             object MandatoryProperties
865             {
866                 get;
867                 set;
868             }
869 
870             object OptionalProperties
871             {
872                 get;
873                 set;
874             }
875 
876             object NamingProperties { get; set; }
877 
878             object DerivedFrom
879             {
880                 get;
881                 set;
882             }
883 
884             object AuxDerivedFrom
885             {
886                 get;
887                 set;
888             }
889 
890             object PossibleSuperiors
891             {
892                 get;
893                 set;
894             }
895 
896             object Containment { get; set; }
897 
898             bool Container { get; set; }
899 
900             string HelpFileName
901             {
902                 [return: MarshalAs(UnmanagedType.BStr)]
903                 get;
904                 [param: MarshalAs(UnmanagedType.BStr)]
905                 set;
906             }
907 
908             int HelpFileContext
909             {
910                 [return: MarshalAs(UnmanagedType.U4)]
911                 get;
912                 [param: MarshalAs(UnmanagedType.U4)]
913                 set;
914             }
915 
916             [return: MarshalAs(UnmanagedType.Interface)]
Qualifiers()917             object Qualifiers();
918         }
919     }
920 }
921