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