/*
 * Copyright 2005 Francois Gouget
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";

typedef enum
{
    ADS_RIGHT_DS_CREATE_CHILD         = 0x00000001,
    ADS_RIGHT_DS_DELETE_CHILD         = 0x00000002,
    ADS_RIGHT_ACTRL_DS_LIST           = 0x00000004,
    ADS_RIGHT_DS_SELF                 = 0x00000008,
    ADS_RIGHT_DS_READ_PROP            = 0x00000010,
    ADS_RIGHT_DS_WRITE_PROP           = 0x00000020,
    ADS_RIGHT_DS_DELETE_TREE          = 0x00000040,
    ADS_RIGHT_DS_LIST_OBJECT          = 0x00000080,
    ADS_RIGHT_DS_CONTROL_ACCESS       = 0x00000100,

    ADS_RIGHT_DELETE                  = 0x00010000,
    ADS_RIGHT_READ_CONTROL            = 0x00020000,
    ADS_RIGHT_WRITE_DAC               = 0x00040000,
    ADS_RIGHT_WRITE_OWNER             = 0x00080000,
    ADS_RIGHT_SYNCHRONIZE             = 0x00100000,
    ADS_RIGHT_ACCESS_SYSTEM_SECURITY  = 0x00200000,

    ADS_RIGHT_GENERIC_ALL             = 0x10000000,
    ADS_RIGHT_GENERIC_EXECUTE         = 0x20000000,
    ADS_RIGHT_GENERIC_WRITE           = 0x40000000,
    ADS_RIGHT_GENERIC_READ            = 0x80000000
} ADS_RIGHTS_ENUM;

typedef enum
{
    ADS_SECURE_AUTHENTICATION     = 0x1,
    ADS_USE_ENCRYPTION            = 0x2,
    ADS_USE_SSL                   = 0x2,
    ADS_READONLY_SERVER           = 0x4,
    ADS_PROMPT_CREDENTIALS        = 0x8,
    ADS_NO_AUTHENTICATION         = 0x10,
    ADS_FAST_BIND                 = 0x20,
    ADS_USE_SIGNING               = 0x40,
    ADS_USE_SEALING               = 0x80,
    ADS_USE_DELEGATION            = 0x100,
    ADS_SERVER_BIND               = 0x200,
    ADS_NO_REFERRAL_CHASING       = 0x400,
    ADS_AUTH_RESERVED             = 0x80000000
} ADS_AUTHENTICATION_ENUM;

typedef enum
{
    ADS_SEARCHPREF_ASYNCHRONOUS,
    ADS_SEARCHPREF_DEREF_ALIASES,
    ADS_SEARCHPREF_SIZE_LIMIT,
    ADS_SEARCHPREF_TIME_LIMIT,
    ADS_SEARCHPREF_ATTRIBTYPES_ONLY,
    ADS_SEARCHPREF_SEARCH_SCOPE,
    ADS_SEARCHPREF_TIMEOUT,
    ADS_SEARCHPREF_PAGESIZE,
    ADS_SEARCHPREF_PAGED_TIME_LIMIT,
    ADS_SEARCHPREF_CHASE_REFERRALS,
    ADS_SEARCHPREF_SORT_ON,
    ADS_SEARCHPREF_CACHE_RESULTS,
    ADS_SEARCHPREF_DIRSYNC,
    ADS_SEARCHPREF_TOMBSTONE,
    ADS_SEARCHPREF_VLV,
    ADS_SEARCHPREF_ATTRIBUTE_QUERY,
    ADS_SEARCHPREF_SECURITY_MASK,
    ADS_SEARCHPREF_DIRSYNC_FLAG,
    ADS_SEARCHPREF_EXTENDED_DN
} ADS_SEARCHPREF_ENUM;

typedef ADS_SEARCHPREF_ENUM *PADS_SEARCHPREF_INFO;

typedef enum
{
    ADS_STATUS_S_OK,
    ADS_STATUS_INVALID_SEARCHPREF,
    ADS_STATUS_INVALID_SEARCHPREFVALUE
} ADS_STATUSENUM;

typedef enum
{
    ADSTYPE_INVALID,
    ADSTYPE_DN_STRING,
    ADSTYPE_CASE_EXACT_STRING,
    ADSTYPE_CASE_IGNORE_STRING,
    ADSTYPE_PRINTABLE_STRING,
    ADSTYPE_NUMERIC_STRING,
    ADSTYPE_BOOLEAN,
    ADSTYPE_INTEGER,
    ADSTYPE_OCTET_STRING,
    ADSTYPE_UTC_TIME,
    ADSTYPE_LARGE_INTEGER,
    ADSTYPE_PROV_SPECIFIC,
    ADSTYPE_OBJECT_CLASS,
    ADSTYPE_CASEIGNORE_LIST,
    ADSTYPE_OCTET_LIST,
    ADSTYPE_PATH,
    ADSTYPE_POSTALADDRESS,
    ADSTYPE_TIMESTAMP,
    ADSTYPE_BACKLINK,
    ADSTYPE_TYPEDNAME,
    ADSTYPE_HOLD,
    ADSTYPE_NETADDRESS,
    ADSTYPE_REPLICAPOINTER,
    ADSTYPE_FAXNUMBER,
    ADSTYPE_EMAIL,
    ADSTYPE_NT_SECURITY_DESCRIPTOR,
    ADSTYPE_UNKNOWN,
    ADSTYPE_DN_WITH_BINARY,
    ADSTYPE_DN_WITH_STRING
} ADSTYPEENUM;

typedef enum
{
    ADS_PASSWORD_ENCODE_REQUIRE_SSL,
    ADS_PASSWORD_ENCODE_CLEAR
} ADS_PASSWORD_ENCODING_ENUM;

typedef struct _ADS_CASEIGNORE_LIST
{
    struct _ADS_CASEIGNORE_LIST *Next;
    LPWSTR String;
} ADS_CASEIGNORE_LIST;

typedef struct _ADS_OCTET_LIST
{
    struct _ADS_OCTET_LIST *Next;
    DWORD Length;
    BYTE *Data;
} ADS_OCTET_LIST;

typedef struct
{
    DWORD Type;
    LPWSTR VolumeName;
    LPWSTR Path;
} ADS_PATH, *PADS_PATH;

typedef struct
{
    DWORD WholeSeconds;
    DWORD EventID;
} ADS_TIMESTAMP;


typedef ADSTYPEENUM ADSTYPE;
typedef LPWSTR ADS_DN_STRING;
typedef LPWSTR *PADS_DN_STRING;
typedef LPWSTR ADS_CASE_EXACT_STRING;
typedef LPWSTR *PADS_CASE_EXACT_STRING;
typedef LPWSTR ADS_CASE_IGNORE_STRING;
typedef LPWSTR *PADS_CASE_IGNORE_STRING;
typedef LPWSTR ADS_PRINTABLE_STRING;
typedef LPWSTR *PADS_PRINTABLE_STRING;
typedef LPWSTR ADS_NUMERIC_STRING;
typedef LPWSTR *PADS_NUMERIC_STRING;
typedef DWORD ADS_BOOLEAN;
typedef DWORD *LPNDS_BOOLEAN;
typedef DWORD ADS_INTEGER;
typedef DWORD *PADS_INTEGER;
typedef SYSTEMTIME ADS_UTC_TIME;
typedef SYSTEMTIME *PADS_UTC_TIME;
typedef LARGE_INTEGER ADS_LARGE_INTEGER;
typedef LARGE_INTEGER *PADS_LARGE_INTEGER;
typedef LPWSTR ADS_OBJECT_CLASS;
typedef LPWSTR *PADS_OBJECT_CLASS;
typedef struct _ADS_OCTET_LIST *PADS_OCTET_LIST;
typedef struct _ADS_CASEIGNORE_LIST *PADS_CASEIGNORE_LIST;
typedef ADS_STATUSENUM ADS_STATUS;
typedef ADS_SEARCHPREF_ENUM ADS_SEARCHPREF;
typedef HANDLE ADS_SEARCH_HANDLE;
typedef HANDLE *PADS_SEARCH_HANDLE;


typedef struct
{
    DWORD dwLength;
    BYTE *lpValue;
} ADS_OCTET_STRING;

typedef struct
{
    DWORD dwLength;
    BYTE *lpValue;
} ADS_PROV_SPECIFIC;

typedef struct
{
    LPWSTR PostalAddress[ 6 ];
} ADS_POSTALADDRESS, *PADS_POSTALADDRESS;

typedef struct
{
    LPWSTR ObjectName;
    DWORD Level;
    DWORD Interval;
} ADS_TYPEDNAME, *PADS_TYPEDNAME;

typedef struct
{
    DWORD RemoteID;
    LPWSTR ObjectName;
} ADS_BACKLINK;

typedef struct
{
    LPWSTR ObjectName;
    DWORD Amount;
} ADS_HOLD;

typedef struct
{
    DWORD AddressType;
    DWORD AddressLength;
    BYTE *Address;
} ADS_NETADDRESS, *PADS_NETADDRESS;

typedef struct
{
    LPWSTR ServerName;
    DWORD ReplicaType;
    DWORD ReplicaNumber;
    DWORD Count;
    PADS_NETADDRESS ReplicaAddressHints;
} ADS_REPLICAPOINTER, *PADS_REPLICAPOINTER;

typedef struct
{
    LPWSTR TelephoneNumber;
    DWORD NumberOfBits;
    BYTE *Parameters;
} ADS_FAXNUMBER, *PADS_FAXNUMBER;


typedef struct
{
    LPWSTR Address;
    DWORD Type;
} ADS_EMAIL, *PADS_EMAIL;

typedef struct
{
    DWORD dwLength;
    BYTE *lpValue;
} ADS_NT_SECURITY_DESCRIPTOR;

typedef struct
{
    DWORD dwLength;
    BYTE *lpBinaryValue;
    LPWSTR pszDNString;
} ADS_DN_WITH_BINARY, *PADS_DN_WITH_BINARY;

typedef struct
{
    LPWSTR pszStringValue;
    LPWSTR pszDNString;
} ADS_DN_WITH_STRING, *PADS_DN_WITH_STRING;

typedef struct _adsvalue
{
    ADSTYPE dwType;
    union
    {
        ADS_DN_STRING DNString;
        ADS_CASE_EXACT_STRING CaseExactString;
        ADS_CASE_IGNORE_STRING CaseIgnoreString;
        ADS_PRINTABLE_STRING PrintableString;
        ADS_NUMERIC_STRING NumericString;
        ADS_BOOLEAN Boolean;
        ADS_INTEGER Integer;
        ADS_OCTET_STRING OctetString;
        ADS_UTC_TIME UTCTime;
        ADS_LARGE_INTEGER LargeInteger;
        ADS_OBJECT_CLASS ClassName;
        ADS_PROV_SPECIFIC ProviderSpecific;
        PADS_CASEIGNORE_LIST pCaseIgnoreList;
        PADS_OCTET_LIST pOctetList;
        PADS_PATH pPath;
        PADS_POSTALADDRESS pPostalAddress;
        ADS_TIMESTAMP Timestamp;
        ADS_BACKLINK BackLink;
        PADS_TYPEDNAME pTypedName;
        ADS_HOLD Hold;
        PADS_NETADDRESS pNetAddress;
        PADS_REPLICAPOINTER pReplicaPointer;
        PADS_FAXNUMBER pFaxNumber;
        ADS_EMAIL Email;
        ADS_NT_SECURITY_DESCRIPTOR SecurityDescriptor;
        PADS_DN_WITH_BINARY pDNWithBinary;
        PADS_DN_WITH_STRING pDNWithString;
    };
} ADSVALUE, *PADSVALUE;

typedef struct ads_searchpref_info
{
    ADS_SEARCHPREF dwSearchPref;
    ADSVALUE vValue;
    ADS_STATUS dwStatus;
} ADS_SEARCHPREF_INFO;

typedef struct ads_search_column
{
    LPWSTR pszAttrName;
    ADSTYPE dwADsType;
    PADSVALUE pADsValues;
    DWORD dwNumValues;
    HANDLE hReserved;
} ADS_SEARCH_COLUMN, *PADS_SEARCH_COLUMN;

/*****************************************************************************
 *    IADsContainer interface
 */
[
    object,
    uuid(001677d0-fd16-11ce-abc4-02608c9e7553)
]
interface IADsContainer: IDispatch
{
    [propget] HRESULT Count(
        [out, retval] long *retval);
    [propget, restricted] HRESULT _NewEnum(
        [out, retval] IUnknown **retval);
    [propget] HRESULT Filter(
        [out, retval] VARIANT *pvFilter);
    [propput] HRESULT Filter(
        [in] VARIANT vFilter);
    [propget] HRESULT Hints(
        [out, retval] VARIANT *pvHints);
    [propput] HRESULT Hints(
        [in] VARIANT vHints);
    HRESULT GetObject(
        [in] BSTR bstrClassName,
        [in] BSTR bstrRelativeName,
        [out, retval] IDispatch **ppObject);
    HRESULT Create(
        [in] BSTR bstrClassName,
        [in] BSTR bstrRelativeName,
        [out, retval] IDispatch **ppObject);
    HRESULT Delete(
        [in] BSTR bstrClassName,
        [in] BSTR bstrRelativeName);
    HRESULT CopyHere(
        [in] BSTR bstrSourceName,
        [in] BSTR bstrNewName,
        [out, retval] IDispatch **ppObject);
    HRESULT MoveHere(
        [in] BSTR bstrSourceName,
        [in] BSTR bstrNewName,
        [out, retval] IDispatch **ppObject);
}

/*****************************************************************************
 *    IADs interface
 */
[
    odl,
    uuid(FD8256D0-FD15-11CE-ABC4-02608C9E7553),
    dual,
    oleautomation
]
interface IADs : IDispatch
{
    [id(0x00000002), propget]
    HRESULT Name([out, retval] BSTR* retval);

    [id(0x00000003), propget]
    HRESULT Class([out, retval] BSTR* retval);

    [id(0x00000004), propget]
    HRESULT GUID([out, retval] BSTR* retval);

    [id(0x00000005), propget]
    HRESULT ADsPath([out, retval] BSTR* retval);

    [id(0x00000006), propget]
    HRESULT Parent([out, retval] BSTR* retval);

    [id(0x00000007), propget]
    HRESULT Schema([out, retval] BSTR* retval);

    [id(0x00000008)]
    HRESULT GetInfo();

    [id(0x00000009)]
    HRESULT SetInfo();

    [id(0x0000000a)]
    HRESULT Get([in] BSTR bstrName, [out, retval] VARIANT* pvProp);

    [id(0x0000000b)]
    HRESULT Put([in] BSTR bstrName, [in] VARIANT vProp);

    [id(0x0000000c)]
    HRESULT GetEx([in] BSTR bstrName, [out, retval] VARIANT* pvProp);

    [id(0x0000000d)]
    HRESULT PutEx([in] long lnControlCode, [in] BSTR bstrName, [in] VARIANT vProp);

    [id(0x0000000e)]
    HRESULT GetInfoEx( [in] VARIANT vProperties, [in] long lnReserved);
};

/*****************************************************************************
 *    IADsMembers interface
 */
[
    odl,
    uuid(451A0030-72EC-11CF-B03B-00AA006E0975),
    dual,
    oleautomation
]
interface IADsMembers : IDispatch
{
    [id(0x00000002), propget]
    HRESULT Count([out, retval] long* plCount);

    [id(0xfffffffc), propget]
    HRESULT _NewEnum([out, retval] IUnknown** ppEnumerator);

    [id(0x00000003), propget]
    HRESULT Filter([out, retval] VARIANT* pvFilter);

    [id(0x00000003), propput]
    HRESULT Filter([in] VARIANT pvFilter);
};

/*****************************************************************************
 *    IADsGroup interface
 */
[
    odl,
    uuid(27636B00-410F-11CF-B1FF-02608C9E7553),
    dual,
    oleautomation
]
interface IADsGroup : IADs {
    [id(0x0000000f), propget]
    HRESULT Description([out, retval] BSTR* retval);

    [id(0x0000000f), propput]
    HRESULT Description([in] BSTR retval);

    [id(0x00000010)]
    HRESULT Members([out, retval] IADsMembers** ppMembers);

    [id(0x00000011)]
    HRESULT IsMember([in] BSTR bstrMember, [out, retval] VARIANT_BOOL* bMember);

    [id(0x00000012)]
    HRESULT Add([in] BSTR bstrNewItem);

    [id(0x00000013)]
    HRESULT Remove([in] BSTR bstrItemToBeRemoved);
};

/*****************************************************************************
 *    IADsUser interface
 */
[
    odl,
    uuid(3E37E320-17E2-11CF-ABC4-02608C9E7553),
    dual,
    oleautomation
]
interface IADsUser : IADs
{
    [id(0x00000035), propget]
    HRESULT BadLoginAddress([out, retval] BSTR* retval);

    [id(0x00000036), propget]
    HRESULT BadLoginCount([out, retval] long* retval);

    [id(0x00000038), propget]
    HRESULT LastLogin([out, retval] DATE* retval);

    [id(0x00000039), propget]
    HRESULT LastLogoff([out, retval] DATE* retval);

    [id(0x0000003a), propget]
    HRESULT LastFailedLogin([out, retval] DATE* retval);

    [id(0x0000003b), propget]
    HRESULT PasswordLastChanged([out, retval] DATE* retval);

    [id(0x0000000f), propget]
    HRESULT Description([out, retval] BSTR* retval);

    [id(0x0000000f), propput]
    HRESULT Description([in] BSTR retval);

    [id(0x00000013), propget]
    HRESULT Division([out, retval] BSTR* retval);

    [id(0x00000013), propput]
    HRESULT Division([in] BSTR retval);

    [id(0x0000007a), propget]
    HRESULT Department([out, retval] BSTR* retval);

    [id(0x0000007a), propput]
    HRESULT Department([in] BSTR retval);

    [id(0x00000014), propget]
    HRESULT EmployeeID([out, retval] BSTR* retval);

    [id(0x00000014), propput]
    HRESULT EmployeeID([in] BSTR retval);

    [id(0x00000017), propget]
    HRESULT FullName([out, retval] BSTR* retval);

    [id(0x00000017), propput]
    HRESULT FullName([in] BSTR retval);

    [id(0x00000016), propget]
    HRESULT FirstName([out, retval] BSTR* retval);

    [id(0x00000016), propput]
    HRESULT FirstName([in] BSTR retval);

    [id(0x00000019), propget]
    HRESULT LastName([out, retval] BSTR* retval);

    [id(0x00000019), propput]
    HRESULT LastName([in] BSTR retval);

    [id(0x0000001b), propget]
    HRESULT OtherName([out, retval] BSTR* retval);

    [id(0x0000001b), propput]
    HRESULT OtherName([in] BSTR retval);

    [id(0x00000072), propget]
    HRESULT NamePrefix([out, retval] BSTR* retval);

    [id(0x00000072), propput]
    HRESULT NamePrefix([in] BSTR retval);

    [id(0x00000073), propget]
    HRESULT NameSuffix([out, retval] BSTR* retval);

    [id(0x00000073), propput]
    HRESULT NameSuffix([in] BSTR retval);

    [id(0x00000024), propget]
    HRESULT Title([out, retval] BSTR* retval);

    [id(0x00000024), propput]
    HRESULT Title([in] BSTR retval);

    [id(0x0000001a), propget]
    HRESULT Manager([out, retval] BSTR* retval);

    [id(0x0000001a), propput]
    HRESULT Manager([in] BSTR retval);

    [id(0x00000020), propget]
    HRESULT TelephoneHome([out, retval] VARIANT* retval);

    [id(0x00000020), propput]
    HRESULT TelephoneHome([in] VARIANT retval);

    [id(0x00000021), propget]
    HRESULT TelephoneMobile([out, retval] VARIANT* retval);

    [id(0x00000021), propput]
    HRESULT TelephoneMobile([in] VARIANT retval);

    [id(0x00000022), propget]
    HRESULT TelephoneNumber([out, retval] VARIANT* retval);

    [id(0x00000022), propput]
    HRESULT TelephoneNumber([in] VARIANT retval);

    [id(0x00000011), propget]
    HRESULT TelephonePager([out, retval] VARIANT* retval);

    [id(0x00000011), propput]
    HRESULT TelephonePager([in] VARIANT retval);

    [id(0x00000010), propget]
    HRESULT FaxNumber([out, retval] VARIANT* retval);

    [id(0x00000010), propput]
    HRESULT FaxNumber([in] VARIANT retval);

    [id(0x0000001c), propget]
    HRESULT OfficeLocations([out, retval] VARIANT* retval);

    [id(0x0000001c), propput]
    HRESULT OfficeLocations([in] VARIANT retval);

    [id(0x0000001e), propget]
    HRESULT PostalAddresses([out, retval] VARIANT* retval);

    [id(0x0000001e), propput]
    HRESULT PostalAddresses([in] VARIANT retval);

    [id(0x0000001f), propget]
    HRESULT PostalCodes([out, retval] VARIANT* retval);

    [id(0x0000001f), propput]
    HRESULT PostalCodes([in] VARIANT retval);

    [id(0x00000075), propget]
    HRESULT SeeAlso([out, retval] VARIANT* retval);

    [id(0x00000075), propput]
    HRESULT SeeAlso([in] VARIANT retval);

    [id(0x00000025), propget]
    HRESULT AccountDisabled([out, retval] VARIANT_BOOL* retval);

    [id(0x00000025), propput]
    HRESULT AccountDisabled([in] VARIANT_BOOL retval);

    [id(0x00000026), propget]
    HRESULT AccountExpirationDate([out, retval] DATE* retval);

    [id(0x00000026), propput]
    HRESULT AccountExpirationDate([in] DATE retval);

    [id(0x00000029), propget]
    HRESULT GraceLoginsAllowed([out, retval] long* retval);

    [id(0x00000029), propput]
    HRESULT GraceLoginsAllowed([in] long retval);

    [id(0x0000002a), propget]
    HRESULT GraceLoginsRemaining([out, retval] long* retval);

    [id(0x0000002a), propput]
    HRESULT GraceLoginsRemaining([in] long retval);

    [id(0x0000002b), propget]
    HRESULT IsAccountLocked([out, retval] VARIANT_BOOL* retval);

    [id(0x0000002b), propput]
    HRESULT IsAccountLocked([in] VARIANT_BOOL retval);

    [id(0x0000002d), propget]
    HRESULT LoginHours([out, retval] VARIANT* retval);

    [id(0x0000002d), propput]
    HRESULT LoginHours([in] VARIANT retval);

    [id(0x0000002e), propget]
    HRESULT LoginWorkstations([out, retval] VARIANT* retval);

    [id(0x0000002e), propput]
    HRESULT LoginWorkstations([in] VARIANT retval);

    [id(0x0000002f), propget]
    HRESULT MaxLogins([out, retval] long* retval);

    [id(0x0000002f), propput]
    HRESULT MaxLogins([in] long retval);

    [id(0x00000030), propget]
    HRESULT MaxStorage([out, retval] long* retval);

    [id(0x00000030), propput]
    HRESULT MaxStorage([in] long retval);

    [id(0x00000031), propget]
    HRESULT PasswordExpirationDate([out, retval] DATE* retval);

    [id(0x00000031), propput]
    HRESULT PasswordExpirationDate([in] DATE retval);

    [id(0x00000032), propget]
    HRESULT PasswordMinimumLength([out, retval] long* retval);

    [id(0x00000032), propput]
    HRESULT PasswordMinimumLength([in] long retval);

    [id(0x00000033), propget]
    HRESULT PasswordRequired([out, retval] VARIANT_BOOL* retval);

    [id(0x00000033), propput]
    HRESULT PasswordRequired([in] VARIANT_BOOL retval);

    [id(0x00000034), propget]
    HRESULT RequireUniquePassword([out, retval] VARIANT_BOOL* retval);

    [id(0x00000034), propput]
    HRESULT RequireUniquePassword([in] VARIANT_BOOL retval);

    [id(0x0000003c), propget]
    HRESULT EmailAddress([out, retval] BSTR* retval);

    [id(0x0000003c), propput]
    HRESULT EmailAddress([in] BSTR retval);

    [id(0x0000003d), propget]
    HRESULT HomeDirectory([out, retval] BSTR* retval);

    [id(0x0000003d), propput]
    HRESULT HomeDirectory([in] BSTR retval);

    [id(0x0000003e), propget]
    HRESULT Languages([out, retval] VARIANT* retval);

    [id(0x0000003e), propput]
    HRESULT Languages([in] VARIANT retval);

    [id(0x0000003f), propget]
    HRESULT Profile([out, retval] BSTR* retval);

    [id(0x0000003f), propput]
    HRESULT Profile([in] BSTR retval);

    [id(0x00000040), propget]
    HRESULT LoginScript([out, retval] BSTR* retval);

    [id(0x00000040), propput]
    HRESULT LoginScript([in] BSTR retval);

    [id(0x00000041), propget]
    HRESULT Picture([out, retval] VARIANT* retval);

    [id(0x00000041), propput]
    HRESULT Picture([in] VARIANT retval);

    [id(0x00000078), propget]
    HRESULT HomePage([out, retval] BSTR* retval);

    [id(0x00000078), propput]
    HRESULT HomePage([in] BSTR retval);

    [id(0x00000042)]
    HRESULT Groups([out, retval] IADsMembers** ppGroups);

    [id(0x00000043)]
    HRESULT SetPassword([in] BSTR NewPassword);

    [id(0x00000044)]
    HRESULT ChangePassword([in] BSTR bstrOldPassword, [in] BSTR bstrNewPassword);
};

/*****************************************************************************
 *    IDirectorySearch interface
 */
[
    odl,
    local,
    uuid(109BA8EC-92F0-11D0-A790-00C04FD8D5A8)
]
interface IDirectorySearch : IUnknown
{
    HRESULT SetSearchPreference([in] PADS_SEARCHPREF_INFO pSearchPrefs, [in] DWORD dwNumPrefs);
    HRESULT ExecuteSearch([in] LPWSTR pszSearchFilter, [in] LPWSTR* pAttributeNames,
                    [in] DWORD dwNumberAttributes, [out] PADS_SEARCH_HANDLE phSearchResult);
    HRESULT AbandonSearch([in] ADS_SEARCH_HANDLE phSearchResult);
    HRESULT GetFirstRow([in] ADS_SEARCH_HANDLE hSearchResult);
    HRESULT GetNextRow([in] ADS_SEARCH_HANDLE hSearchResult);
    HRESULT GetPreviousRow([in] ADS_SEARCH_HANDLE hSearchResult);
    HRESULT GetNextColumnName([in] ADS_SEARCH_HANDLE hSearchHandle, [out] LPWSTR* ppszColumnName);
    HRESULT GetColumn( [in] ADS_SEARCH_HANDLE hSearchResult, [in] LPWSTR szColumnName,
                    [out] PADS_SEARCH_COLUMN pSearchColumn);
    HRESULT FreeColumn([in] PADS_SEARCH_COLUMN pSearchColumn);
    HRESULT CloseSearchHandle([in] ADS_SEARCH_HANDLE hSearchResult);
};
