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