forked from gentilkiwi/mimikatz
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDsGetDC.h
636 lines (533 loc) · 15.9 KB
/
DsGetDC.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
/*++ BUILD Version: 0001 // Increment this if a change has global effects
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
dsgetdc.h
Abstract:
This file contains structures, function prototypes, and definitions
for the DsGetDcName API.
Environment:
User Mode - Win32
Notes:
--*/
#ifndef _DSGETDC_
#define _DSGETDC_
#if _MSC_VER > 1000
#pragma once
#endif
#if !defined(_DSGETDCAPI_)
#define DSGETDCAPI DECLSPEC_IMPORT
#else
#define DSGETDCAPI
#endif
#ifdef __cplusplus
extern "C" {
#endif
//
// Structure definitions
//
//
// Flags to passed to DsGetDcName
//
#define DS_FORCE_REDISCOVERY 0x00000001
#define DS_DIRECTORY_SERVICE_REQUIRED 0x00000010
#define DS_DIRECTORY_SERVICE_PREFERRED 0x00000020
#define DS_GC_SERVER_REQUIRED 0x00000040
#define DS_PDC_REQUIRED 0x00000080
#define DS_BACKGROUND_ONLY 0x00000100
#define DS_IP_REQUIRED 0x00000200
#define DS_KDC_REQUIRED 0x00000400
#define DS_TIMESERV_REQUIRED 0x00000800
#define DS_WRITABLE_REQUIRED 0x00001000
#define DS_GOOD_TIMESERV_PREFERRED 0x00002000
#define DS_AVOID_SELF 0x00004000
#define DS_ONLY_LDAP_NEEDED 0x00008000
#define DS_IS_FLAT_NAME 0x00010000
#define DS_IS_DNS_NAME 0x00020000
#define DS_TRY_NEXTCLOSEST_SITE 0x00040000
#define DS_DIRECTORY_SERVICE_6_REQUIRED 0x00080000
#define DS_WEB_SERVICE_REQUIRED 0x00100000
#define DS_RETURN_DNS_NAME 0x40000000
#define DS_RETURN_FLAT_NAME 0x80000000
#define DSGETDC_VALID_FLAGS ( \
DS_FORCE_REDISCOVERY | \
DS_DIRECTORY_SERVICE_REQUIRED | \
DS_DIRECTORY_SERVICE_PREFERRED | \
DS_GC_SERVER_REQUIRED | \
DS_PDC_REQUIRED | \
DS_BACKGROUND_ONLY | \
DS_IP_REQUIRED | \
DS_KDC_REQUIRED | \
DS_TIMESERV_REQUIRED | \
DS_WRITABLE_REQUIRED | \
DS_GOOD_TIMESERV_PREFERRED | \
DS_AVOID_SELF | \
DS_ONLY_LDAP_NEEDED | \
DS_IS_FLAT_NAME | \
DS_IS_DNS_NAME | \
DS_TRY_NEXTCLOSEST_SITE | \
DS_DIRECTORY_SERVICE_6_REQUIRED | \
DS_WEB_SERVICE_REQUIRED | \
DS_RETURN_FLAT_NAME | \
DS_RETURN_DNS_NAME )
//
// Structure returned from DsGetDcName
//
typedef struct _DOMAIN_CONTROLLER_INFOA {
LPSTR DomainControllerName;
LPSTR DomainControllerAddress;
ULONG DomainControllerAddressType;
GUID DomainGuid;
LPSTR DomainName;
LPSTR DnsForestName;
ULONG Flags;
LPSTR DcSiteName;
LPSTR ClientSiteName;
} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA;
typedef struct _DOMAIN_CONTROLLER_INFOW {
#ifdef MIDL_PASS
[string,unique] wchar_t *DomainControllerName;
#else // MIDL_PASS
LPWSTR DomainControllerName;
#endif // MIDL_PASS
#ifdef MIDL_PASS
[string,unique] wchar_t *DomainControllerAddress;
#else // MIDL_PASS
LPWSTR DomainControllerAddress;
#endif // MIDL_PASS
ULONG DomainControllerAddressType;
GUID DomainGuid;
#ifdef MIDL_PASS
[string,unique] wchar_t *DomainName;
#else // MIDL_PASS
LPWSTR DomainName;
#endif // MIDL_PASS
#ifdef MIDL_PASS
[string,unique] wchar_t *DnsForestName;
#else // MIDL_PASS
LPWSTR DnsForestName;
#endif // MIDL_PASS
ULONG Flags;
#ifdef MIDL_PASS
[string,unique] wchar_t *DcSiteName;
#else // MIDL_PASS
LPWSTR DcSiteName;
#endif // MIDL_PASS
#ifdef MIDL_PASS
[string,unique] wchar_t *ClientSiteName;
#else // MIDL_PASS
LPWSTR ClientSiteName;
#endif // MIDL_PASS
} DOMAIN_CONTROLLER_INFOW, *PDOMAIN_CONTROLLER_INFOW;
#ifdef UNICODE
#define DOMAIN_CONTROLLER_INFO DOMAIN_CONTROLLER_INFOW
#define PDOMAIN_CONTROLLER_INFO PDOMAIN_CONTROLLER_INFOW
#else
#define DOMAIN_CONTROLLER_INFO DOMAIN_CONTROLLER_INFOA
#define PDOMAIN_CONTROLLER_INFO PDOMAIN_CONTROLLER_INFOA
#endif // !UNICODE
//
// Values for DomainControllerAddressType
//
#define DS_INET_ADDRESS 1
#define DS_NETBIOS_ADDRESS 2
//
// Values for returned Flags
//
#define DS_PDC_FLAG 0x00000001 // DC is PDC of Domain
#define DS_GC_FLAG 0x00000004 // DC is a GC of forest
#define DS_LDAP_FLAG 0x00000008 // Server supports an LDAP server
#define DS_DS_FLAG 0x00000010 // DC supports a DS and is a Domain Controller
#define DS_KDC_FLAG 0x00000020 // DC is running KDC service
#define DS_TIMESERV_FLAG 0x00000040 // DC is running time service
#define DS_CLOSEST_FLAG 0x00000080 // DC is in closest site to client
#define DS_WRITABLE_FLAG 0x00000100 // DC has a writable DS
#define DS_GOOD_TIMESERV_FLAG 0x00000200 // DC is running time service (and has clock hardware)
#define DS_NDNC_FLAG 0x00000400 // DomainName is non-domain NC serviced by the LDAP server
#define DS_SELECT_SECRET_DOMAIN_6_FLAG 0x00000800 // DC has some secrets
#define DS_FULL_SECRET_DOMAIN_6_FLAG 0x00001000 // DC has all secrets
#define DS_WS_FLAG 0x00002000 // DC is running web service
#define DS_PING_FLAGS 0x000FFFFF // Flags returned on ping
#define DS_DNS_CONTROLLER_FLAG 0x20000000 // DomainControllerName is a DNS name
#define DS_DNS_DOMAIN_FLAG 0x40000000 // DomainName is a DNS name
#define DS_DNS_FOREST_FLAG 0x80000000 // DnsForestName is a DNS name
//
// Function Prototypes
//
DSGETDCAPI
DWORD
WINAPI
DsGetDcNameA(
IN __in_opt LPCSTR ComputerName OPTIONAL,
IN __in_opt LPCSTR DomainName OPTIONAL,
IN GUID *DomainGuid OPTIONAL,
IN __in_opt LPCSTR SiteName OPTIONAL,
IN ULONG Flags,
OUT PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo
);
DSGETDCAPI
DWORD
WINAPI
DsGetDcNameW(
IN __in_opt LPCWSTR ComputerName OPTIONAL,
IN __in_opt LPCWSTR DomainName OPTIONAL,
IN GUID *DomainGuid OPTIONAL,
IN __in_opt LPCWSTR SiteName OPTIONAL,
IN ULONG Flags,
OUT PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
);
#ifdef UNICODE
#define DsGetDcName DsGetDcNameW
#else
#define DsGetDcName DsGetDcNameA
#endif // !UNICODE
DSGETDCAPI
DWORD
WINAPI
DsGetSiteNameA(
IN __in_opt LPCSTR ComputerName OPTIONAL,
OUT __deref_out LPSTR *SiteName
);
DSGETDCAPI
DWORD
WINAPI
DsGetSiteNameW(
IN __in_opt LPCWSTR ComputerName OPTIONAL,
OUT __deref_out LPWSTR *SiteName
);
#ifdef UNICODE
#define DsGetSiteName DsGetSiteNameW
#else
#define DsGetSiteName DsGetSiteNameA
#endif // !UNICODE
DSGETDCAPI
DWORD
WINAPI
DsValidateSubnetNameW(
__in IN LPCWSTR SubnetName
);
DSGETDCAPI
DWORD
WINAPI
DsValidateSubnetNameA(
__in IN LPCSTR SubnetName
);
#ifdef UNICODE
#define DsValidateSubnetName DsValidateSubnetNameW
#else
#define DsValidateSubnetName DsValidateSubnetNameA
#endif // !UNICODE
//
// Only include if winsock2.h has been included
//
#ifdef _WINSOCK2API_
DSGETDCAPI
DWORD
WINAPI
DsAddressToSiteNamesW(
IN __in_opt LPCWSTR ComputerName OPTIONAL,
IN DWORD EntryCount,
IN PSOCKET_ADDRESS SocketAddresses,
OUT __deref_out_ecount(EntryCount) LPWSTR **SiteNames
);
DSGETDCAPI
DWORD
WINAPI
DsAddressToSiteNamesA(
IN __in_opt LPCSTR ComputerName OPTIONAL,
IN DWORD EntryCount,
IN PSOCKET_ADDRESS SocketAddresses,
OUT __deref_out_ecount(EntryCount) LPSTR **SiteNames
);
#ifdef UNICODE
#define DsAddressToSiteNames DsAddressToSiteNamesW
#else
#define DsAddressToSiteNames DsAddressToSiteNamesA
#endif // !UNICODE
DSGETDCAPI
DWORD
WINAPI
DsAddressToSiteNamesExW(
IN __in_opt LPCWSTR ComputerName OPTIONAL,
IN DWORD EntryCount,
IN PSOCKET_ADDRESS SocketAddresses,
OUT __deref_out_ecount(EntryCount) LPWSTR **SiteNames,
OUT __deref_out_ecount(EntryCount) LPWSTR **SubnetNames
);
DSGETDCAPI
DWORD
WINAPI
DsAddressToSiteNamesExA(
IN __in_opt LPCSTR ComputerName OPTIONAL,
IN DWORD EntryCount,
IN PSOCKET_ADDRESS SocketAddresses,
OUT __deref_out_ecount(EntryCount) LPSTR **SiteNames,
OUT __deref_out_ecount(EntryCount) LPSTR **SubnetNames
);
#ifdef UNICODE
#define DsAddressToSiteNamesEx DsAddressToSiteNamesExW
#else
#define DsAddressToSiteNamesEx DsAddressToSiteNamesExA
#endif // !UNICODE
#endif // _WINSOCK2API_
//
// API to enumerate trusted domains
//
typedef struct _DS_DOMAIN_TRUSTSW {
//
// Name of the trusted domain.
//
#ifdef MIDL_PASS
[string] wchar_t * NetbiosDomainName;
[string] wchar_t * DnsDomainName;
#else // MIDL_PASS
LPWSTR NetbiosDomainName;
LPWSTR DnsDomainName;
#endif // MIDL_PASS
//
// Flags defining attributes of the trust.
//
ULONG Flags;
#define DS_DOMAIN_IN_FOREST 0x0001 // Domain is a member of the forest
#define DS_DOMAIN_DIRECT_OUTBOUND 0x0002 // Domain is directly trusted
#define DS_DOMAIN_TREE_ROOT 0x0004 // Domain is root of a tree in the forest
#define DS_DOMAIN_PRIMARY 0x0008 // Domain is the primary domain of queried server
#define DS_DOMAIN_NATIVE_MODE 0x0010 // Primary domain is running in native mode
#define DS_DOMAIN_DIRECT_INBOUND 0x0020 // Domain is directly trusting
#define DS_DOMAIN_VALID_FLAGS ( \
DS_DOMAIN_IN_FOREST | \
DS_DOMAIN_DIRECT_OUTBOUND | \
DS_DOMAIN_TREE_ROOT | \
DS_DOMAIN_PRIMARY | \
DS_DOMAIN_NATIVE_MODE | \
DS_DOMAIN_DIRECT_INBOUND )
//
// Index to the domain that is the parent of this domain.
// Only defined if NETLOGON_DOMAIN_IN_FOREST is set and
// NETLOGON_DOMAIN_TREE_ROOT is not set.
//
ULONG ParentIndex;
//
// The trust type and attributes of this trust.
//
// If NETLOGON_DOMAIN_DIRECTLY_TRUSTED is not set,
// these value are infered.
//
ULONG TrustType;
ULONG TrustAttributes;
//
// The SID of the trusted domain.
//
// If NETLOGON_DOMAIN_DIRECTLY_TRUSTED is not set,
// this value will be NULL.
//
#if defined(MIDL_PASS)
PISID DomainSid;
#else
PSID DomainSid;
#endif
//
// The GUID of the trusted domain.
//
GUID DomainGuid;
} DS_DOMAIN_TRUSTSW, *PDS_DOMAIN_TRUSTSW;
//
// ANSI version of the above struct
//
typedef struct _DS_DOMAIN_TRUSTSA {
LPSTR NetbiosDomainName;
LPSTR DnsDomainName;
ULONG Flags;
ULONG ParentIndex;
ULONG TrustType;
ULONG TrustAttributes;
PSID DomainSid;
GUID DomainGuid;
} DS_DOMAIN_TRUSTSA, *PDS_DOMAIN_TRUSTSA;
#ifdef UNICODE
#define DS_DOMAIN_TRUSTS DS_DOMAIN_TRUSTSW
#define PDS_DOMAIN_TRUSTS PDS_DOMAIN_TRUSTSW
#else
#define DS_DOMAIN_TRUSTS DS_DOMAIN_TRUSTSA
#define PDS_DOMAIN_TRUSTS PDS_DOMAIN_TRUSTSA
#endif // !UNICODE
DSGETDCAPI
DWORD
WINAPI
DsEnumerateDomainTrustsW (
__in_opt LPWSTR ServerName OPTIONAL,
__in ULONG Flags,
__deref_out_ecount(*DomainCount) PDS_DOMAIN_TRUSTSW *Domains,
__out PULONG DomainCount
);
DSGETDCAPI
DWORD
WINAPI
DsEnumerateDomainTrustsA (
__in_opt LPSTR ServerName OPTIONAL,
__in ULONG Flags,
__deref_out_ecount(*DomainCount) PDS_DOMAIN_TRUSTSA *Domains,
__out PULONG DomainCount
);
#ifdef UNICODE
#define DsEnumerateDomainTrusts DsEnumerateDomainTrustsW
#else
#define DsEnumerateDomainTrusts DsEnumerateDomainTrustsA
#endif // !UNICODE
//
// Only define this API if the caller has #included the pre-requisite
// ntlsa.h or ntsecapi.h
//
#if defined(_NTLSA_) || defined(_NTSECAPI_)
DSGETDCAPI
DWORD
WINAPI
DsGetForestTrustInformationW (
IN LPCWSTR ServerName OPTIONAL,
IN LPCWSTR TrustedDomainName OPTIONAL,
IN DWORD Flags,
OUT PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo
);
#define DS_GFTI_UPDATE_TDO 0x1 // Update TDO with information returned
#define DS_GFTI_VALID_FLAGS 0x1 // All valid flags to DsGetForestTrustInformation
DSGETDCAPI
DWORD
WINAPI
DsMergeForestTrustInformationW(
IN LPCWSTR DomainName,
IN PLSA_FOREST_TRUST_INFORMATION NewForestTrustInfo,
IN PLSA_FOREST_TRUST_INFORMATION OldForestTrustInfo OPTIONAL,
OUT PLSA_FOREST_TRUST_INFORMATION *MergedForestTrustInfo
);
#endif // _NTLSA_ || _NTSECAPI_
DSGETDCAPI
DWORD
WINAPI
DsGetDcSiteCoverageW(
IN __in_opt LPCWSTR ServerName OPTIONAL,
OUT PULONG EntryCount,
OUT __deref_out_ecount(*EntryCount) LPWSTR **SiteNames
);
DSGETDCAPI
DWORD
WINAPI
DsGetDcSiteCoverageA(
IN __in_opt LPCSTR ServerName OPTIONAL,
OUT PULONG EntryCount,
OUT __deref_out_ecount(*EntryCount) LPSTR **SiteNames
);
#ifdef UNICODE
#define DsGetDcSiteCoverage DsGetDcSiteCoverageW
#else
#define DsGetDcSiteCoverage DsGetDcSiteCoverageA
#endif // !UNICODE
DSGETDCAPI
DWORD
WINAPI
DsDeregisterDnsHostRecordsW (
__in_opt LPWSTR ServerName OPTIONAL,
__in_opt LPWSTR DnsDomainName OPTIONAL,
__in_opt GUID *DomainGuid OPTIONAL,
__in_opt GUID *DsaGuid OPTIONAL,
__in LPWSTR DnsHostName
);
DSGETDCAPI
DWORD
WINAPI
DsDeregisterDnsHostRecordsA (
__in_opt LPSTR ServerName OPTIONAL,
__in_opt LPSTR DnsDomainName OPTIONAL,
__in_opt GUID *DomainGuid OPTIONAL,
__in_opt GUID *DsaGuid OPTIONAL,
__in LPSTR DnsHostName
);
#ifdef UNICODE
#define DsDeregisterDnsHostRecords DsDeregisterDnsHostRecordsW
#else
#define DsDeregisterDnsHostRecords DsDeregisterDnsHostRecordsA
#endif // !UNICODE
#ifdef _WINSOCK2API_ // DsGetDcOpen/Next/Close depend on winsock2.h be included
//
// Option flags passed to DsGetDcOpen
//
#define DS_ONLY_DO_SITE_NAME 0x01 // Non-site specific names should be avoided.
#define DS_NOTIFY_AFTER_SITE_RECORDS 0x02 // Return ERROR_FILEMARK_DETECTED after all
// site specific records have been processed.
#define DS_OPEN_VALID_OPTION_FLAGS ( DS_ONLY_DO_SITE_NAME | DS_NOTIFY_AFTER_SITE_RECORDS )
//
// Valid DcFlags for DsGetDcOpen
//
#define DS_OPEN_VALID_FLAGS ( \
DS_FORCE_REDISCOVERY | \
DS_ONLY_LDAP_NEEDED | \
DS_KDC_REQUIRED | \
DS_PDC_REQUIRED | \
DS_GC_SERVER_REQUIRED | \
DS_WRITABLE_REQUIRED )
DSGETDCAPI
DWORD
WINAPI
DsGetDcOpenW(
IN LPCWSTR DnsName,
IN ULONG OptionFlags,
IN LPCWSTR SiteName OPTIONAL,
IN GUID *DomainGuid OPTIONAL,
IN LPCWSTR DnsForestName OPTIONAL,
IN ULONG DcFlags,
OUT PHANDLE RetGetDcContext
);
DSGETDCAPI
DWORD
WINAPI
DsGetDcOpenA(
IN LPCSTR DnsName,
IN ULONG OptionFlags,
IN LPCSTR SiteName OPTIONAL,
IN GUID *DomainGuid OPTIONAL,
IN LPCSTR DnsForestName OPTIONAL,
IN ULONG DcFlags,
OUT PHANDLE RetGetDcContext
);
#ifdef UNICODE
#define DsGetDcOpen DsGetDcOpenW
#else
#define DsGetDcOpen DsGetDcOpenA
#endif // !UNICODE
DSGETDCAPI
DWORD
WINAPI
DsGetDcNextW(
IN HANDLE GetDcContextHandle,
OUT PULONG SockAddressCount OPTIONAL,
OUT LPSOCKET_ADDRESS *SockAddresses OPTIONAL,
OUT __deref_opt_out LPWSTR *DnsHostName OPTIONAL
);
DSGETDCAPI
DWORD
WINAPI
DsGetDcNextA(
IN HANDLE GetDcContextHandle,
OUT PULONG SockAddressCount OPTIONAL,
OUT LPSOCKET_ADDRESS *SockAddresses OPTIONAL,
OUT __deref_opt_out LPSTR *DnsHostName OPTIONAL
);
#ifdef UNICODE
#define DsGetDcNext DsGetDcNextW
#else
#define DsGetDcNext DsGetDcNextA
#endif // !UNICODE
DSGETDCAPI
VOID
WINAPI
DsGetDcCloseW(
IN HANDLE GetDcContextHandle
);
#ifdef UNICODE
#define DsGetDcClose DsGetDcCloseW
#else
#define DsGetDcClose DsGetDcCloseW // same for ANSI
#endif // !UNICODE
#endif // _WINSOCK2API_
#ifdef __cplusplus
}
#endif
#endif // _DSGETDC_