1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 23 * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 24 */ 25 26 #ifndef _MLSVC_LSA_NDL_ 27 #define _MLSVC_LSA_NDL_ 28 29 /* 30 * Local Security Authority RPC (LSARPC) interface definition. 31 * 32 * Names containing a backslash ('\') are known as qualified or composite 33 * names. The string preceding the backslash is assumed to be the domain 34 * name and the string following the slash is assumed to be name to be 35 * resolved within that domain. 36 * 37 * Names that do not contain a backslash are known as isolated names. 38 * An isolated name may be a single label, such as john, or may be in 39 * user principal name (UPN) form, such as john@example.com. 40 */ 41 42 #include <libmlrpc/ndrtypes.ndl> 43 44 45 #define LSARPC_OPNUM_CloseHandle 0x00 46 #define LSARPC_OPNUM_Delete 0x01 47 #define LSARPC_OPNUM_EnumPrivileges 0x02 48 #define LSARPC_OPNUM_QuerySecurityObject 0x03 49 #define LSARPC_OPNUM_SetSecurityObject 0x04 50 #define LSARPC_OPNUM_ChangePassword 0x05 51 #define LSARPC_OPNUM_OpenPolicy 0x06 52 #define LSARPC_OPNUM_QueryInfoPolicy 0x07 53 #define LSARPC_OPNUM_SetInfoPolicy 0x08 54 #define LSARPC_OPNUM_ClearAuditLog 0x09 55 #define LSARPC_OPNUM_CreateAccount 0x0a 56 #define LSARPC_OPNUM_EnumerateAccounts 0x0b 57 #define LSARPC_OPNUM_CreateTrustedDomain 0x0c 58 #define LSARPC_OPNUM_EnumTrustedDomain 0x0d 59 #define LSARPC_OPNUM_LookupNames 0x0e 60 #define LSARPC_OPNUM_LookupSids 0x0f 61 #define LSARPC_OPNUM_CreateSecret 0x10 62 #define LSARPC_OPNUM_OpenAccount 0x11 63 #define LSARPC_OPNUM_EnumPrivsAccount 0x12 64 #define LSARPC_OPNUM_AddAccountPrivs 0x13 65 #define LSARPC_OPNUM_RemoveAccountPrivs 0x14 66 #define LSARPC_OPNUM_GetAccountQuota 0x15 67 #define LSARPC_OPNUM_SetAccountQuota 0x16 68 #define LSARPC_OPNUM_GetSystemAccessAccount 0x17 69 #define LSARPC_OPNUM_SetSystemAccessAccount 0x18 70 #define LSARPC_OPNUM_OpenTrustedDomain 0x19 71 #define LSARPC_OPNUM_QueryInfoTrustedDomain 0x1a 72 #define LSARPC_OPNUM_SetinfoTrustedDomain 0x1b 73 #define LSARPC_OPNUM_OpenSecret 0x1c 74 #define LSARPC_OPNUM_SetSecret 0x1d 75 #define LSARPC_OPNUM_QuerySecret 0x1e 76 #define LSARPC_OPNUM_LookupPrivValue 0x1f 77 #define LSARPC_OPNUM_LookupPrivName 0x20 78 #define LSARPC_OPNUM_LookupPrivDisplayName 0x21 79 #define LSARPC_OPNUM_DeleteObject 0x22 80 #define LSARPC_OPNUM_EnumAccountsWithUserRight 0x23 81 #define LSARPC_OPNUM_EnumAccountRights 0x24 82 #define LSARPC_OPNUM_AddAccountRights 0x25 83 #define LSARPC_OPNUM_RemoveAccountRights 0x26 84 #define LSARPC_OPNUM_QueryTrustedDomainInfo 0x27 85 #define LSARPC_OPNUM_SetTrustedDomainInfo 0x28 86 87 /* Windows 2000 */ 88 #define LSARPC_OPNUM_DeleteTrustedDomain 0x29 89 #define LSARPC_OPNUM_StorePrivateData 0x2a 90 #define LSARPC_OPNUM_RetrievePrivateData 0x2b 91 #define LSARPC_OPNUM_OpenPolicy2 0x2c 92 #define LSARPC_OPNUM_GetConnectedUser 0x2d 93 #define LSARPC_OPNUM_QueryInfoPolicy2 0x2e 94 #define LSARPC_OPNUM_SetInfoPolicy2 0x2f 95 #define LSARPC_OPNUM_QueryTrustedDomainInfoByName 0x30 96 #define LSARPC_OPNUM_SetTrustedDomainInfoByName 0x31 97 #define LSARPC_OPNUM_EnumTrustedDomainsEx 0x32 98 #define LSARPC_OPNUM_CreateTrustedDomainEx 0x33 99 #define LSARPC_OPNUM_CloseTrustedDomainEx 0x34 100 #define LSARPC_OPNUM_QueryDomainInfoPolicy 0x35 101 #define LSARPC_OPNUM_SetDomainInfoPolicy 0x36 102 #define LSARPC_OPNUM_OpenTrustedDomainByName 0x37 103 #define LSARPC_OPNUM_TestCall 0x38 104 #define LSARPC_OPNUM_LookupSids2 0x39 105 #define LSARPC_OPNUM_LookupNames2 0x3a 106 #define LSARPC_OPNUM_CreateTrustedDomainEx2 0x3b 107 108 /* Windows 2000 SP3 */ 109 #define LSARPC_OPNUM_CredWrite 0x3c 110 #define LSARPC_OPNUM_CredRead 0x3d 111 #define LSARPC_OPNUM_CredEnumerate 0x3e 112 #define LSARPC_OPNUM_CredWriteDomainCreds 0x3f 113 #define LSARPC_OPNUM_CredReadDomainCreds 0x40 114 #define LSARPC_OPNUM_CredDelete 0x41 115 #define LSARPC_OPNUM_CredGetTargetInfo 0x42 116 #define LSARPC_OPNUM_CredProfileLoaded 0x43 117 #define LSARPC_OPNUM_LookupNames3 0x44 118 #define LSARPC_OPNUM_CredGetSessionTypes 0x45 119 #define LSARPC_OPNUM_RegisterAuditEvent 0x46 120 #define LSARPC_OPNUM_GenAuditEvent 0x47 121 #define LSARPC_OPNUM_UnregisterAuditEvent 0x48 122 #define LSARPC_OPNUM_QueryForestTrustInfo 0x49 123 #define LSARPC_OPNUM_SetForestTrustInfo 0x4a 124 #define LSARPC_OPNUM_CredRename 0x4b 125 #define LSARPC_OPNUM_LookupSids3 0x4c 126 #define LSARPC_OPNUM_LookupNames4 0x4d 127 #define LSARPC_OPNUM_OpenPolicySce 0x4e 128 129 /* Windows Server 2003 */ 130 #define LSARPC_OPNUM_AdtRegisterSecurityEventSource 0x4f 131 #define LSARPC_OPNUM_AdtUnregisterSecurityEventSource 0x50 132 #define LSARPC_OPNUM_AdtReportSecurityEvent 0x51 133 134 /* Windows Vista */ 135 #define LSARPC_OPNUM_CredFindBestCredential 0x52 136 #define LSARPC_OPNUM_SetAuditPolicy 0x53 137 #define LSARPC_OPNUM_QueryAuditPolicy 0x54 138 #define LSARPC_OPNUM_EnumerateAuditPolicy 0x55 139 #define LSARPC_OPNUM_EnumerateAuditCategories 0x56 140 #define LSARPC_OPNUM_EnumerateAuditSubCategories 0x57 141 #define LSARPC_OPNUM_LookupAuditCategoryName 0x58 142 #define LSARPC_OPNUM_LookupAuditSubCategoryName 0x59 143 #define LSARPC_OPNUM_SetAuditSecurity 0x5a 144 #define LSARPC_OPNUM_QueryAuditSecurity 0x5b 145 #define LSARPC_OPNUM_CredReadByTokenHandle 0x5c 146 #define LSARPC_OPNUM_CredRestoreCredentials 0x5d 147 #define LSARPC_OPNUM_CredBackupCredentials 0x5e 148 149 /* 150 * Lookup levels. Level 1 appears to mean only look on the local host and 151 * level 2 means forward the request to the PDC. On the PDC it probably 152 * doesn't matter which level you use but on a BDC a level 1 lookup will 153 * fail if the BDC doesn't have the info whereas a level 2 lookup will also 154 * check with the PDC. 155 */ 156 #define LSA_LOOKUP_WKSTA 1 /* Windows NT 3.1 */ 157 #define LSA_LOOKUP_PDC 2 158 #define LSA_LOOKUP_TDL 3 159 #define LSA_LOOKUP_GC 4 /* Windows 2000 */ 160 #define LSA_LOOKUP_XFORESTREFERRAL 5 /* Windows XP */ 161 #define LSA_LOOKUP_XFORESTRESOLVE 6 162 #define LSA_LOOKUP_RODCREFERRALTOFULLDC 7 /* Windows Vista */ 163 164 /* 165 * Name/SID lookup flags 166 */ 167 #define LSA_LOOKUP_NAME_NOT_SPN 0x00000001 168 #define LSA_LOOKUP_NAME_MAYBE_XFOREST 0x00000002 169 #define LSA_LOOKUP_NAME_IN_DBVIEW 0x00000004 170 171 /* 172 * Name/SID lookup options 173 * 174 * 0x00000000 Lookup isolated names both locally and in domains/forests. 175 * 0x80000000 Lookup isolated names (except for UPNs) only in the local 176 * account database. Do not lookup UPNs. 177 */ 178 #define LSA_LOOKUP_OPT_ALL 0x00000000 179 #define LSA_LOOKUP_OPT_LOCAL 0x80000000 180 181 /* 182 * Client revision 183 * 184 * 0x00000001 Client does not understand DNS names or forests. 185 * 0x00000002 Client understands DNS names and forests. 186 * 187 * Notes: 188 * 0 means the same as 1 189 * Anything greater than 2 means the same as 2 190 */ 191 #define LSA_CLIENT_REVISION_NT 0x00000001 192 #define LSA_CLIENT_REVISION_AD 0x00000002 193 194 /* 195 * Definition for a SID. The ndl compiler won't allow a typedef of 196 * a structure containing variable size members. 197 */ 198 struct mslsa_sid { 199 BYTE Revision; 200 BYTE SubAuthCount; 201 BYTE Authority[6]; 202 SIZE_IS(SubAuthCount) 203 DWORD SubAuthority[ANY_SIZE_ARRAY]; 204 }; 205 206 struct mslsa_string_desc { 207 WORD length; 208 WORD allosize; 209 LPTSTR str; 210 }; 211 typedef struct mslsa_string_desc mslsa_string_t; 212 213 CONTEXT_HANDLE(mslsa_handle) mslsa_handle_t; 214 215 struct mslsa_luid { 216 DWORD low_part; 217 DWORD high_part; 218 }; 219 typedef struct mslsa_luid mslsa_luid_t; 220 221 struct mslsa_guid { 222 DWORD data1; 223 WORD data2; 224 WORD data3; 225 BYTE data4[8]; 226 }; 227 typedef struct mslsa_guid mslsa_guid_t; 228 229 /* 230 *********************************************************************** 231 * OpenPolicy2 obtains a handle for a remote LSA. This handle is 232 * required for all subsequent LSA requests. 233 * 234 * The server name should be the name of the target PDC or BDC, with 235 * the double backslash prefix. 236 * 237 * As far as I can tell, the mslsa_object_attributes structure can be 238 * all zero except for the length, which should be set to sizeof(struct 239 * mslsa_object_attributes). 240 * 241 * For read access, the desired access mask should contain the 242 * READ_CONTROL standard right and whatever policy rights are required. 243 * I haven't tried any update operations but if you get the access mask 244 * wrong you can crash the domain controller. 245 *********************************************************************** 246 */ 247 248 249 /* 250 * From netmon: 251 * length = 12 252 * impersonation_level = 2 253 * context_tracking_mode = 1 254 * effective_only = 0 255 */ 256 struct mslsa_quality_of_service { 257 DWORD length; 258 WORD impersonation_level; 259 BYTE context_tracking_mode; 260 BYTE effective_only; 261 }; 262 263 264 struct mslsa_object_attributes { 265 DWORD length; 266 DWORD rootDirectory; 267 DWORD objectName; 268 DWORD attributes; 269 DWORD securityDescriptor; 270 struct mslsa_quality_of_service *qualityOfService; 271 }; 272 273 274 OPERATION(LSARPC_OPNUM_OpenPolicy) 275 struct mslsa_OpenPolicy { 276 IN DWORD *servername; 277 IN struct mslsa_object_attributes attributes; 278 IN DWORD desiredAccess; 279 OUT mslsa_handle_t domain_handle; 280 OUT DWORD status; 281 }; 282 283 OPERATION(LSARPC_OPNUM_OpenPolicy2) 284 struct mslsa_OpenPolicy2 { 285 IN LPTSTR servername; 286 IN struct mslsa_object_attributes attributes; 287 IN DWORD desiredAccess; 288 OUT mslsa_handle_t domain_handle; 289 OUT DWORD status; 290 }; 291 292 293 /* 294 *********************************************************************** 295 * CloseHandle closes an association with the LSA. The returned handle 296 * will be all zero. 297 *********************************************************************** 298 */ 299 OPERATION(LSARPC_OPNUM_CloseHandle) 300 struct mslsa_CloseHandle { 301 IN mslsa_handle_t handle; 302 OUT mslsa_handle_t result_handle; 303 OUT DWORD status; 304 }; 305 306 307 /* 308 *********************************************************************** 309 * EnumPrivileges 310 * 311 * Obtain a list of privilege names. This interface is not implemented 312 * yet The definition below has not been tested. This is a guess based 313 * on data available from netmon. 314 *********************************************************************** 315 */ 316 struct mslsa_PrivDef { 317 mslsa_string_t name; 318 mslsa_luid_t luid; 319 }; 320 321 322 struct mslsa_PrivEnumBuf { 323 DWORD entries_read; 324 SIZE_IS(entries_read) 325 struct mslsa_PrivDef *def; 326 }; 327 328 329 OPERATION(LSARPC_OPNUM_EnumPrivileges) 330 struct mslsa_EnumPrivileges { 331 IN mslsa_handle_t handle; 332 INOUT DWORD enum_context; 333 IN DWORD max_length; 334 OUT REFERENCE struct mslsa_PrivEnumBuf *enum_buf; 335 OUT DWORD status; 336 }; 337 338 339 /* 340 *********************************************************************** 341 * QuerySecurityObject. I'm not entirely sure how to set this up yet. 342 * I used the discovery RPC to scope it out. The structures are set up 343 * according to netmon and the assumption that a security descriptor 344 * on the wire looks like the regular user level security descriptor. 345 *********************************************************************** 346 */ 347 struct mslsa_SecurityDescriptor { 348 BYTE revision; 349 BYTE sbz1; 350 WORD control; 351 DWORD owner; 352 DWORD group; 353 DWORD sacl; 354 DWORD dacl; 355 }; 356 357 358 struct mslsa_SecurityDescInfo { 359 DWORD length; 360 SIZE_IS(length) 361 BYTE *desc; /* temporary */ 362 /* struct mslsa_SecurityDescriptor *desc; */ 363 }; 364 365 366 OPERATION(LSARPC_OPNUM_QuerySecurityObject) 367 struct mslsa_QuerySecurityObject { 368 IN mslsa_handle_t handle; 369 IN DWORD security_info; 370 OUT struct mslsa_SecurityDescInfo *desc_info; 371 OUT DWORD status; 372 }; 373 374 375 /* 376 *********************************************************************** 377 * EnumerateAccounts and EnumerateTrustedDomain. 378 *********************************************************************** 379 */ 380 struct mslsa_AccountInfo { 381 struct mslsa_sid *sid; 382 }; 383 384 385 struct mslsa_EnumAccountBuf { 386 DWORD entries_read; 387 SIZE_IS(entries_read) 388 struct mslsa_AccountInfo *info; 389 }; 390 391 392 OPERATION(LSARPC_OPNUM_EnumerateAccounts) 393 struct mslsa_EnumerateAccounts { 394 IN mslsa_handle_t handle; 395 INOUT DWORD enum_context; 396 IN DWORD max_length; 397 OUT REFERENCE struct mslsa_EnumAccountBuf *enum_buf; 398 OUT DWORD status; 399 }; 400 401 402 struct mslsa_TrustedDomainInfo { 403 mslsa_string_t name; 404 struct mslsa_sid *sid; 405 }; 406 407 408 struct mslsa_EnumTrustedDomainBuf { 409 DWORD entries_read; 410 SIZE_IS(entries_read) 411 struct mslsa_TrustedDomainInfo *info; 412 }; 413 414 415 OPERATION(LSARPC_OPNUM_EnumTrustedDomain) 416 struct mslsa_EnumTrustedDomain { 417 IN mslsa_handle_t handle; 418 INOUT DWORD enum_context; 419 IN DWORD max_length; 420 OUT REFERENCE struct mslsa_EnumTrustedDomainBuf *enum_buf; 421 OUT DWORD status; 422 }; 423 424 struct mslsa_TrustedDomainInfoEx { 425 mslsa_string_t dns_name; 426 mslsa_string_t nb_name; 427 struct mslsa_sid *sid; 428 DWORD trust_direction; 429 DWORD trust_type; 430 DWORD trust_attrs; 431 }; 432 433 struct mslsa_EnumTrustedDomainBufEx { 434 DWORD entries_read; 435 SIZE_IS(entries_read) 436 struct mslsa_TrustedDomainInfoEx *info; 437 }; 438 439 OPERATION(LSARPC_OPNUM_EnumTrustedDomainsEx) 440 struct mslsa_EnumTrustedDomainEx { 441 IN mslsa_handle_t handle; 442 INOUT DWORD enum_context; 443 IN DWORD max_length; 444 OUT REFERENCE struct mslsa_EnumTrustedDomainBufEx *enum_buf; 445 OUT DWORD status; 446 }; 447 448 /* 449 *********************************************************************** 450 * Definitions common to both LookupSids and LookupNames. Both return 451 * an mslsa_domain_table[]. Each interface also returns a specific 452 * table with entries which index the mslsa_domain_table[]. 453 *********************************************************************** 454 */ 455 struct mslsa_domain_entry { 456 mslsa_string_t domain_name; 457 struct mslsa_sid *domain_sid; 458 }; 459 typedef struct mslsa_domain_entry mslsa_domain_entry_t; 460 461 462 struct mslsa_domain_table { 463 DWORD n_entry; 464 SIZE_IS(n_entry) 465 mslsa_domain_entry_t *entries; 466 DWORD max_n_entry; 467 }; 468 469 470 /* 471 *********************************************************************** 472 * Definitions for LookupSids. 473 * 474 * The input parameters are: 475 * 476 * A valid LSA handle obtained from an LsarOpenPolicy. 477 * The table of SIDs to be looked up. 478 * A table of names (probably empty). 479 * The lookup level (local=1 or PDC=2). 480 * An enumeration counter (used for continuation operations). 481 * 482 * The output results are: 483 * 484 * A table of referenced domains. 485 * A table of usernames. 486 * The updated value of the enumeration counter. 487 * The result status. 488 *********************************************************************** 489 */ 490 491 struct mslsa_lup_sid_entry { 492 struct mslsa_sid *psid; 493 }; 494 495 struct mslsa_lup_sid_table { 496 DWORD n_entry; 497 SIZE_IS(n_entry) 498 struct mslsa_lup_sid_entry *entries; 499 }; 500 501 struct mslsa_name_entry { 502 WORD sid_name_use; 503 WORD unknown_flags; 504 mslsa_string_t name; 505 DWORD domain_ix; /* -1 means none */ 506 }; 507 508 struct mslsa_name_table { 509 DWORD n_entry; 510 SIZE_IS(n_entry) 511 struct mslsa_name_entry *entries; 512 }; 513 514 OPERATION(LSARPC_OPNUM_LookupSids) 515 struct mslsa_LookupSids { 516 IN mslsa_handle_t handle; 517 IN struct mslsa_lup_sid_table lup_sid_table; 518 519 OUT struct mslsa_domain_table *domain_table; 520 INOUT struct mslsa_name_table name_table; 521 522 IN WORD lookup_level; 523 INOUT DWORD mapped_count; 524 OUT DWORD status; 525 }; 526 527 OPERATION(LSARPC_OPNUM_CreateSecret) 528 struct mslsa_CreateSecret { 529 IN mslsa_handle_t handle; 530 IN mslsa_string_t name; 531 IN DWORD access_mask; 532 OUT mslsa_handle_t secret_handle; 533 OUT DWORD status; 534 }; 535 536 /* 537 *********************************************************************** 538 * Definitions for LookupNames. 539 * 540 * LookupNames requires the following input parameters. 541 * 542 * A valid LSA handle obtained from an LsarOpenPolicy. 543 * The table of names to be looked up. 544 * A table of translated sids (probably empty). 545 * The lookup level (local=1 or PDC=2). 546 * An enumeration counter (used for continuation operations). 547 * 548 * The outputs are as follows. 549 * 550 * A table of referenced domains. 551 * A table of translated sids (actually rids). 552 * The updated value of the enumeration counter. 553 * The result status. 554 *********************************************************************** 555 */ 556 struct mslsa_lup_name_table { 557 DWORD n_entry; 558 SIZE_IS(n_entry) 559 mslsa_string_t names[ANY_SIZE_ARRAY]; 560 }; 561 562 563 struct mslsa_rid_entry { 564 WORD sid_name_use; 565 WORD pad; 566 DWORD rid; 567 DWORD domain_index; 568 }; 569 570 571 struct mslsa_rid_table { 572 DWORD n_entry; 573 SIZE_IS(n_entry) 574 struct mslsa_rid_entry *rids; 575 }; 576 577 578 OPERATION(LSARPC_OPNUM_LookupNames) 579 struct mslsa_LookupNames { 580 IN mslsa_handle_t handle; 581 IN REFERENCE struct mslsa_lup_name_table *name_table; 582 583 OUT struct mslsa_domain_table *domain_table; 584 INOUT struct mslsa_rid_table translated_sids; 585 586 IN WORD lookup_level; 587 INOUT DWORD mapped_count; 588 OUT DWORD status; 589 }; 590 591 592 /* 593 *********************************************************************** 594 * QueryInfoPolicy returns various pieces of policy information. The 595 * desired information is specified using a class value, as defined 596 * below. 597 *********************************************************************** 598 */ 599 #define MSLSA_POLICY_AUDIT_LOG_INFO 1 600 #define MSLSA_POLICY_AUDIT_EVENTS_INFO 2 601 #define MSLSA_POLICY_PRIMARY_DOMAIN_INFO 3 602 #define MSLSA_POLICY_UNKNOWN_4_INFO 4 603 #define MSLSA_POLICY_ACCOUNT_DOMAIN_INFO 5 604 #define MSLSA_POLICY_SERVER_ROLE_INFO 6 605 #define MSLSA_POLICY_REPLICA_SOURCE_INFO 7 606 #define MSLSA_POLICY_DEFAULT_QUOTA_INFO 8 607 #define MSLSA_POLICY_DB_INFO 9 608 #define MSLSA_POLICY_AUDIT_SET_INFO 10 609 #define MSLSA_POLICY_AUDIT_QUERY_INFO 11 610 #define MSLSA_POLICY_DNS_DOMAIN_INFO 12 611 612 #define LSA_ROLE_STANDALONE_WORKSTATION 0 613 #define LSA_ROLE_MEMBER_WORKSTATION 1 614 #define LSA_ROLE_STANDALONE_SERVER 2 615 #define LSA_ROLE_MEMBER_SERVER 3 616 #define LSA_ROLE_BACKUP_DC 4 617 #define LSA_ROLE_PRIMARY_DC 5 618 619 /* 620 * MSLSA_POLICY_AUDIT_EVENTS_INFO 621 */ 622 struct mslsa_AuditEventsInfo { 623 DWORD enabled; 624 SIZE_IS (count) 625 DWORD *settings; 626 DWORD count; 627 }; 628 629 /* 630 * MSLSA_POLICY_PRIMARY_DOMAIN_INFO 631 */ 632 struct mslsa_PrimaryDomainInfo { 633 struct mslsa_string_desc name; 634 struct mslsa_sid *sid; 635 }; 636 637 /* 638 * MSLSA_POLICY_ACCOUNT_DOMAIN_INFO 639 */ 640 struct mslsa_AccountDomainInfo { 641 struct mslsa_string_desc name; 642 struct mslsa_sid *sid; 643 }; 644 645 /* 646 * MSLSA_POLICY_SERVER_ROLE_INFO 647 */ 648 struct mslsa_ServerRoleInfo { 649 DWORD role; 650 DWORD pad; 651 }; 652 653 struct mslsa_DnsDomainInfo { 654 struct mslsa_string_desc nb_domain; 655 struct mslsa_string_desc dns_domain; 656 struct mslsa_string_desc forest; 657 struct mslsa_guid guid; 658 struct mslsa_sid *sid; 659 }; 660 661 union mslsa_PolicyInfoResUnion { 662 CASE(2) struct mslsa_AuditEventsInfo audit_events; 663 CASE(3) struct mslsa_PrimaryDomainInfo pd_info; 664 CASE(5) struct mslsa_AccountDomainInfo ad_info; 665 CASE(6) struct mslsa_ServerRoleInfo server_role; 666 CASE(12) struct mslsa_DnsDomainInfo dns_info; 667 DEFAULT char *nullptr; 668 }; 669 670 /* 671 * This structure needs to be declared, even though it can't be used in 672 * mslsa_QueryInfoPolicy, in order to get the appropriate size to calculate 673 * the correct fixup offsets. If ndrgen did the right thing, 674 * mslsa_PolicyInfoRes would be one of the out parameters. However, if 675 * we do it that way, the switch_value isn't known early enough to do 676 * the fixup calculation. So it all has to go in mslsa_QueryInfoPolicy. 677 */ 678 struct mslsa_PolicyInfoRes { 679 DWORD address; 680 WORD switch_value; 681 SWITCH(switch_value) 682 union mslsa_PolicyInfoResUnion ru; 683 }; 684 685 OPERATION(LSARPC_OPNUM_QueryInfoPolicy) 686 struct mslsa_QueryInfoPolicy { 687 IN mslsa_handle_t handle; 688 IN WORD info_class; 689 /* 690 * Can't use this form because we need to include members explicitly. 691 * OUT struct mslsa_PolicyInfoRes result; 692 */ 693 OUT DWORD address; 694 OUT WORD switch_value; 695 SWITCH(switch_value) 696 OUT union mslsa_PolicyInfoResUnion ru; 697 OUT DWORD status; 698 }; 699 700 701 702 /* 703 *********************************************************************** 704 * OpenAccount. 705 * 706 * Returns a handle that can be used to access the account specified 707 * by a SID. This handle can be used to enumerate account privileges. 708 *********************************************************************** 709 */ 710 OPERATION(LSARPC_OPNUM_OpenAccount) 711 struct mslsa_OpenAccount { 712 IN mslsa_handle_t handle; 713 IN REFERENCE struct mslsa_sid *sid; 714 IN DWORD access_mask; 715 OUT mslsa_handle_t account_handle; 716 OUT DWORD status; 717 }; 718 719 720 721 /* 722 *********************************************************************** 723 * EnumPrivilegesAccount. 724 * 725 * Enumerate the list of privileges held by the specified account. The 726 * handle must be a valid account handle obtained via OpenAccount. The 727 * luid values returned will be probably only be relevant on the domain 728 * controller so we'll need to find a way to convert them to the 729 * actual privilege names. 730 *********************************************************************** 731 */ 732 struct mslsa_LuidAndAttributes { 733 struct mslsa_luid luid; 734 DWORD attributes; 735 }; 736 737 738 struct mslsa_PrivilegeSet { 739 DWORD privilege_count; 740 DWORD control; 741 SIZE_IS(privilege_count) 742 struct mslsa_LuidAndAttributes privilege[ANY_SIZE_ARRAY]; 743 }; 744 745 746 OPERATION(LSARPC_OPNUM_EnumPrivsAccount) 747 struct mslsa_EnumPrivsAccount { 748 IN mslsa_handle_t account_handle; 749 OUT struct mslsa_PrivilegeSet *privileges; 750 OUT DWORD status; 751 }; 752 753 OPERATION(LSARPC_OPNUM_OpenSecret) 754 struct mslsa_OpenSecret { 755 IN mslsa_handle_t handle; 756 IN mslsa_string_t name; 757 IN DWORD access_mask; 758 OUT mslsa_handle_t secret_handle; 759 OUT DWORD status; 760 }; 761 762 763 /* 764 *********************************************************************** 765 * LookupPrivValue 766 * 767 * Map a privilege name to a local unique id (LUID). Privilege names 768 * are consistent across the network. LUIDs are machine specific. 769 * The privilege list is provided as a set of LUIDs so the privilege 770 * lookup functions must be used to identify which the privilege to 771 * which each LUID refers. The handle here is a policy handle. 772 *********************************************************************** 773 */ 774 OPERATION(LSARPC_OPNUM_LookupPrivValue) 775 struct mslsa_LookupPrivValue { 776 IN mslsa_handle_t handle; 777 IN mslsa_string_t name; 778 OUT struct mslsa_luid luid; 779 OUT DWORD status; 780 }; 781 782 783 /* 784 *********************************************************************** 785 * LookupPrivName 786 * 787 * Map a privilege value (LUID) to a privilege name. Privilege names 788 * are consistent across the network. LUIDs are machine specific. 789 * The privilege list is provided as a set of LUIDs so the privilege 790 * lookup functions must be used to identify which the privilege to 791 * which each LUID refers. The handle here is a policy handle. 792 *********************************************************************** 793 */ 794 OPERATION(LSARPC_OPNUM_LookupPrivName) 795 struct mslsa_LookupPrivName { 796 IN mslsa_handle_t handle; 797 IN struct mslsa_luid luid; 798 OUT mslsa_string_t *name; 799 OUT DWORD status; 800 }; 801 802 803 /* 804 *********************************************************************** 805 * LookupPrivDisplayName 806 * 807 * Map a privilege name to a local unique id (LUID). Privilege names 808 * are consistent across the network. LUIDs are machine specific. 809 * The privilege list is provided as a set of LUIDs so the privilege 810 * lookup functions must be used to identify which the privilege to 811 * which each LUID refers. The handle here is a policy handle. 812 *********************************************************************** 813 */ 814 OPERATION(LSARPC_OPNUM_LookupPrivDisplayName) 815 struct mslsa_LookupPrivDisplayName { 816 IN mslsa_handle_t handle; 817 IN mslsa_string_t name; 818 IN WORD client_language; 819 IN WORD default_language; 820 OUT mslsa_string_t *display_name; 821 OUT WORD language_ret; 822 OUT DWORD status; 823 }; 824 825 826 /* 827 *********************************************************************** 828 * GetConnectedUser 829 * 830 * Return the account name and NetBIOS domain name for the user making 831 * the request. All input fields should be ignored by the server. 832 *********************************************************************** 833 */ 834 struct mslsa_DomainName { 835 struct mslsa_string_desc *name; 836 }; 837 838 839 OPERATION(LSARPC_OPNUM_GetConnectedUser) 840 struct mslsa_GetConnectedUser { 841 IN LPTSTR hostname; 842 IN BYTE *owner_in; 843 IN BYTE *domain_in; 844 OUT struct mslsa_string_desc *owner; 845 OUT struct mslsa_DomainName *domain; 846 OUT DWORD status; 847 }; 848 849 850 /* 851 *********************************************************************** 852 * LSARPC_OPNUM_LookupSids2 853 * 854 * SID lookup function that appeared in Windows 2000. It appears to be 855 * very similar to the original SID lookup RPC. There are two extra IN 856 * parameters, which we don't care about. The OUT name structure has 857 * an extra field, in which zero seems to be okay. 858 *********************************************************************** 859 */ 860 struct lsar_name_entry2 { 861 WORD sid_name_use; 862 WORD padding; 863 mslsa_string_t name; 864 DWORD domain_ix; /* -1 means none */ 865 DWORD flags; 866 }; 867 typedef struct lsar_name_entry2 lsar_translated_name_ex_t; 868 869 struct lsar_name_table2 { 870 DWORD n_entry; 871 SIZE_IS(n_entry) 872 struct lsar_name_entry2 *entries; 873 }; 874 typedef struct lsar_name_table2 lsar_translated_names_ex_t; 875 876 OPERATION(LSARPC_OPNUM_LookupSids2) 877 struct lsar_lookup_sids2 { 878 IN mslsa_handle_t policy_handle; 879 IN struct mslsa_lup_sid_table lup_sid_table; 880 OUT struct mslsa_domain_table *domain_table; 881 INOUT struct lsar_name_table2 name_table; 882 IN WORD lookup_level; 883 INOUT DWORD mapped_count; 884 IN DWORD lookup_options; 885 IN DWORD client_revision; 886 OUT DWORD status; 887 }; 888 889 OPERATION(LSARPC_OPNUM_LookupSids3) 890 struct lsar_lookup_sids3 { 891 IN struct mslsa_lup_sid_table lup_sid_table; 892 OUT struct mslsa_domain_table *domain_table; 893 INOUT lsar_translated_names_ex_t name_table; 894 IN WORD lookup_level; 895 INOUT DWORD mapped_count; 896 IN DWORD lookup_options; 897 IN DWORD client_revision; 898 OUT DWORD status; 899 }; 900 901 /* 902 *********************************************************************** 903 * LSARPC_OPNUM_LookupNames2 904 * 905 * Name lookup function that appeared in Windows 2000. It appears to be 906 * very similar to the original name lookup RPC. There are two extra IN 907 * parameters, which we don't care about. The lsar_rid_entry2 structure 908 * has an extra field, in which zero seems to be okay. 909 *********************************************************************** 910 */ 911 struct lsar_rid_entry2 { 912 WORD sid_name_use; 913 WORD pad; 914 DWORD rid; 915 DWORD domain_index; /* -1 means none */ 916 DWORD flags; 917 }; 918 919 920 struct lsar_rid_table2 { 921 DWORD n_entry; 922 SIZE_IS(n_entry) 923 struct lsar_rid_entry2 *rids; 924 }; 925 926 927 OPERATION(LSARPC_OPNUM_LookupNames2) 928 struct lsar_LookupNames2 { 929 IN mslsa_handle_t policy_handle; 930 IN REFERENCE struct mslsa_lup_name_table *name_table; 931 OUT struct mslsa_domain_table *domain_table; 932 INOUT struct lsar_rid_table2 translated_sids; 933 IN WORD lookup_level; 934 INOUT DWORD mapped_count; 935 IN DWORD lookup_options; 936 IN DWORD client_revision; 937 OUT DWORD status; 938 }; 939 940 struct lsar_translated_sid_ex2 { 941 WORD sid_name_use; 942 WORD pad; 943 struct mslsa_sid *sid; 944 DWORD domain_index; /* -1 means none */ 945 DWORD flags; 946 }; 947 typedef struct lsar_translated_sid_ex2 lsar_translated_sid_ex2_t; 948 949 struct lsar_sid_ex2_table { 950 DWORD n_entry; 951 SIZE_IS(n_entry) 952 struct lsar_translated_sid_ex2 *sids; 953 }; 954 typedef struct lsar_sid_ex2_table lsar_sid_ex2_table_t; 955 956 OPERATION(LSARPC_OPNUM_LookupNames3) 957 struct lsar_LookupNames3 { 958 IN mslsa_handle_t policy_handle; 959 IN REFERENCE struct mslsa_lup_name_table *name_table; 960 OUT struct mslsa_domain_table *domain_table; 961 INOUT struct lsar_sid_ex2_table translated_sids; 962 IN WORD lookup_level; 963 INOUT DWORD mapped_count; 964 IN DWORD lookup_options; 965 IN DWORD client_revision; 966 OUT DWORD status; 967 }; 968 969 OPERATION(LSARPC_OPNUM_LookupNames4) 970 struct lsar_LookupNames4 { 971 IN REFERENCE struct mslsa_lup_name_table *name_table; 972 OUT struct mslsa_domain_table *domain_table; 973 INOUT struct lsar_sid_ex2_table translated_sids; 974 IN WORD lookup_level; 975 INOUT DWORD mapped_count; 976 IN DWORD lookup_options; 977 IN DWORD client_revision; 978 OUT DWORD status; 979 }; 980 981 /* 982 *********************************************************************** 983 * The LSARPC interface definition. 984 *********************************************************************** 985 */ 986 INTERFACE(0) 987 union lsarpc_interface { 988 CASE(LSARPC_OPNUM_CloseHandle) 989 struct mslsa_CloseHandle CloseHandle; 990 CASE(LSARPC_OPNUM_QuerySecurityObject) 991 struct mslsa_QuerySecurityObject QuerySecurityObj; 992 CASE(LSARPC_OPNUM_EnumerateAccounts) 993 struct mslsa_EnumerateAccounts EnumAccounts; 994 CASE(LSARPC_OPNUM_EnumTrustedDomainsEx) 995 struct mslsa_EnumTrustedDomainEx EnumTrustedDomainEx; 996 CASE(LSARPC_OPNUM_EnumTrustedDomain) 997 struct mslsa_EnumTrustedDomain EnumTrustedDomain; 998 CASE(LSARPC_OPNUM_OpenAccount) 999 struct mslsa_OpenAccount OpenAccount; 1000 CASE(LSARPC_OPNUM_EnumPrivsAccount) 1001 struct mslsa_EnumPrivsAccount EnumPrivsAccount; 1002 CASE(LSARPC_OPNUM_LookupPrivValue) 1003 struct mslsa_LookupPrivValue LookupPrivValue; 1004 CASE(LSARPC_OPNUM_LookupPrivName) 1005 struct mslsa_LookupPrivName LookupPrivName; 1006 CASE(LSARPC_OPNUM_LookupPrivDisplayName) 1007 struct mslsa_LookupPrivDisplayName LookupPrivDisplayName; 1008 CASE(LSARPC_OPNUM_CreateSecret) 1009 struct mslsa_CreateSecret CreateSecret; 1010 CASE(LSARPC_OPNUM_OpenSecret) 1011 struct mslsa_OpenSecret OpenSecret; 1012 CASE(LSARPC_OPNUM_QueryInfoPolicy) 1013 struct mslsa_QueryInfoPolicy QueryInfoPolicy; 1014 CASE(LSARPC_OPNUM_OpenPolicy) 1015 struct mslsa_OpenPolicy OpenPolicy; 1016 CASE(LSARPC_OPNUM_OpenPolicy2) 1017 struct mslsa_OpenPolicy2 OpenPolicy2; 1018 CASE(LSARPC_OPNUM_LookupSids) 1019 struct mslsa_LookupSids LookupSids; 1020 CASE(LSARPC_OPNUM_LookupNames) 1021 struct mslsa_LookupNames LookupNames; 1022 CASE(LSARPC_OPNUM_GetConnectedUser) 1023 struct mslsa_GetConnectedUser GetConnectedUser; 1024 CASE(LSARPC_OPNUM_LookupSids2) 1025 struct lsar_lookup_sids2 LookupSids2; 1026 CASE(LSARPC_OPNUM_LookupSids3) 1027 struct lsar_lookup_sids3 LookupSids3; 1028 CASE(LSARPC_OPNUM_LookupNames2) 1029 struct lsar_LookupNames2 LookupNames2; 1030 CASE(LSARPC_OPNUM_LookupNames3) 1031 struct lsar_LookupNames3 LookupNames3; 1032 CASE(LSARPC_OPNUM_LookupNames4) 1033 struct lsar_LookupNames4 LookupNames4; 1034 }; 1035 typedef union lsarpc_interface lsarpc_interface_t; 1036 EXTERNTYPEINFO(lsarpc_interface) 1037 1038 #endif /* _MLSVC_LSA_NDL_ */