import "oaidl.idl";
import "ocidl.idl";

	// Constants

	typedef enum RenameOption
	{
		admtDoNotRename,
		admtRenameWithPrefix,
		admtRenameWithSuffix,
	}
	RenameOption;

	typedef enum PasswordOption
	{
		admtPasswordFromName,
		admtComplexPassword,
		admtCopyPassword,
	}
	PasswordOption;

	typedef enum ConflictOptions
	{
		admtIgnoreConflicting           = 0x00,
		admtReplaceConflicting          = 0x01,
		admtRenameConflictingWithPrefix = 0x02,
		admtRenameConflictingWithSuffix = 0x03,
		admtRemoveExistingUserRights    = 0x10,
		admtRemoveExistingMembers       = 0x20,
		admtMoveReplacedAccounts        = 0x40,
	}
	ConflictOptions;

	typedef enum DisableOption
	{
		admtEnableTarget       = 0x00,
		admtDisableSource      = 0x01,
		admtDisableTarget      = 0x02,
		admtTargetSameAsSource = 0x04,
	}
	DisableOption;

	typedef enum SourceExpiration
	{
		admtNoExpiration = -1
	}
	SourceExpiration;

	typedef enum TranslateOption
	{
		admtTranslateReplace,
		admtTranslateAdd,
		admtTranslateRemove,
	}
	TranslateOption;

	typedef enum ReportType
	{
		admtReportMigratedAccounts,
		admtReportMigratedComputers,
		admtReportExpiredComputers,
		admtReportAccountReferences,
		admtReportNameConflicts,
	}
	ReportType;

	typedef enum DataOptions
	{
		admtNone,
		admtData,
		admtFile,
		admtDomain,
		admtRecurse           = 0x0100,
		admtFlattenHierarchy  = 0x0000,
		admtMaintainHierarchy = 0x0200,
	}
	DataOptions;

	// forward references

	interface IUserMigration;
	interface IGroupMigration;
	interface IComputerMigration;
	interface ISecurityTranslation;
	interface IServiceAccountEnumeration;
	interface IReportGeneration;

	// IMigration

	[
		object,
		uuid(FFA0E908-9849-4CFC-803E-F6A8ACF704A6),
		dual,
		helpstring("IMigration Interface"),
		pointer_default(unique)
	]
	interface IMigration : IDispatch
	{
		[id( 1), propput] HRESULT TestMigration([in] VARIANT_BOOL bTest);
		[id( 1), propget] HRESULT TestMigration([out, retval] VARIANT_BOOL* pbTest);
		[id( 2), propput] HRESULT IntraForest([in] VARIANT_BOOL bIntraForest);
		[id( 2), propget] HRESULT IntraForest([out, retval] VARIANT_BOOL* pbIntraForest);
		[id( 3), propput] HRESULT SourceDomain([in] BSTR bstrDomain);
		[id( 3), propget] HRESULT SourceDomain([out, retval] BSTR* pbstrDomain);
		[id( 4), propput] HRESULT SourceOu([in] BSTR bstrOu);
		[id( 4), propget] HRESULT SourceOu([out, retval] BSTR* pbstrOu);
		[id( 5), propput] HRESULT TargetDomain([in] BSTR bstrDomain);
		[id( 5), propget] HRESULT TargetDomain([out, retval] BSTR* pbstrDomain);
		[id( 6), propput] HRESULT TargetOu([in] BSTR bstrOu);
		[id( 6), propget] HRESULT TargetOu([out, retval] BSTR* pbstrOu);
		[id( 7), propput] HRESULT RenameOption([in] long lOption);
		[id( 7), propget] HRESULT RenameOption([out, retval] long* plOption);
		[id( 8), propput] HRESULT RenamePrefixOrSuffix([in] BSTR bstrPrefixOrSuffix);
		[id( 8), propget] HRESULT RenamePrefixOrSuffix([out, retval] BSTR* pbstrPrefixOrSuffix);
		[id( 9), propput] HRESULT PasswordOption([in] long lOption);
		[id( 9), propget] HRESULT PasswordOption([out, retval] long* plOption);
		[id(10), propput] HRESULT PasswordServer([in] BSTR bstrServer);
		[id(10), propget] HRESULT PasswordServer([out, retval] BSTR* pbstrServer);
		[id(11), propput] HRESULT PasswordFile([in] BSTR bstrPath);
		[id(11), propget] HRESULT PasswordFile([out, retval] BSTR* pbstrPath);
		[id(12), propput] HRESULT ConflictOptions([in] long lOptions);
		[id(12), propget] HRESULT ConflictOptions([out, retval] long* plOptions);
		[id(13), propput] HRESULT ConflictPrefixOrSuffix([in] BSTR bstrPrefixOrSuffix);
		[id(13), propget] HRESULT ConflictPrefixOrSuffix([out, retval] BSTR* pbstrPrefixOrSuffix);
		[id(14), propput] HRESULT UserPropertiesToExclude([in] BSTR bstrProperties);
		[id(14), propget] HRESULT UserPropertiesToExclude([out, retval] BSTR* pbstrProperties);
		[id(15), propput] HRESULT GroupPropertiesToExclude([in] BSTR bstrProperties);
		[id(15), propget] HRESULT GroupPropertiesToExclude([out, retval] BSTR* pbstrProperties);
		[id(16), propput] HRESULT ComputerPropertiesToExclude([in] BSTR bstrProperties);
		[id(16), propget] HRESULT ComputerPropertiesToExclude([out, retval] BSTR* pbstrProperties);
		[id(17)] HRESULT CreateUserMigration([out, retval] IUserMigration** pitfUserMigration);
		[id(18)] HRESULT CreateGroupMigration([out, retval] IGroupMigration** pitfGroupMigration);
		[id(19)] HRESULT CreateComputerMigration([out, retval] IComputerMigration** pitfComputerMigration);
		[id(20)] HRESULT CreateSecurityTranslation([out, retval] ISecurityTranslation** pitfSecurityTranslation);
		[id(21)] HRESULT CreateServiceAccountEnumeration([out, retval] IServiceAccountEnumeration** pitfServiceAccountEnumeration);
		[id(22)] HRESULT CreateReportGeneration([out, retval] IReportGeneration** pitfReportGeneration);
	};

	// IUserMigration

	[
		object,
		uuid(ED07BCE9-5968-4BE8-BE85-E976C93AD2CC),
		dual,
		helpstring("IUserMigration Interface"),
		pointer_default(unique)
	]
	interface IUserMigration : IDispatch
	{
		[id(1), propput] HRESULT DisableOption([in] long lOption);
		[id(1), propget] HRESULT DisableOption([out, retval] long* plOption);
		[id(2), propput] HRESULT SourceExpiration([in] long lExpiration);
		[id(2), propget] HRESULT SourceExpiration([out, retval] long* plExpiration);
		[id(3), propput] HRESULT MigrateSIDs([in] VARIANT_BOOL bMigrate);
		[id(3), propget] HRESULT MigrateSIDs([out, retval] VARIANT_BOOL* pbMigrate);
		[id(4), propput] HRESULT TranslateRoamingProfile([in] VARIANT_BOOL bTranslate);
		[id(4), propget] HRESULT TranslateRoamingProfile([out, retval] VARIANT_BOOL* pbTranslate);
		[id(5), propput] HRESULT UpdateUserRights([in] VARIANT_BOOL bUpdate);
		[id(5), propget] HRESULT UpdateUserRights([out, retval] VARIANT_BOOL* pbUpdate);
		[id(6), propput] HRESULT MigrateGroups([in] VARIANT_BOOL bMigrate);
		[id(6), propget] HRESULT MigrateGroups([out, retval] VARIANT_BOOL* pbMigrate);
		[id(7), propput] HRESULT UpdatePreviouslyMigratedObjects([in] VARIANT_BOOL bUpdate);
		[id(7), propget] HRESULT UpdatePreviouslyMigratedObjects([out, retval] VARIANT_BOOL* pbUpdate);
		[id(8), propput] HRESULT FixGroupMembership([in] VARIANT_BOOL bFix);
		[id(8), propget] HRESULT FixGroupMembership([out, retval] VARIANT_BOOL* pbFix);
		[id(9)] HRESULT Migrate([in] long lOptions, [in, optional] VARIANT vntInclude, [in, optional] VARIANT vntExclude);
		[id(10), propput] HRESULT MigrateServiceAccounts([in] VARIANT_BOOL bMigrate);
		[id(10), propget] HRESULT MigrateServiceAccounts([out, retval] VARIANT_BOOL* pbMigrate);
	};

	// IGroupMigration

	[
		object,
		uuid(A29D4925-B16A-4E89-9328-BF50999C8EDD),
		dual,
		helpstring("IGroupMigration Interface"),
		pointer_default(unique)
	]
	interface IGroupMigration : IDispatch
	{
		[id(1), propput] HRESULT MigrateSIDs([in] VARIANT_BOOL bMigrate);
		[id(1), propget] HRESULT MigrateSIDs([out, retval] VARIANT_BOOL* pbMigrate);
		[id(2), propput] HRESULT UpdateGroupRights([in] VARIANT_BOOL bUpdate);
		[id(2), propget] HRESULT UpdateGroupRights([out, retval] VARIANT_BOOL* pbUpdate);
		[id(3), propput] HRESULT UpdatePreviouslyMigratedObjects([in] VARIANT_BOOL bUpdate);
		[id(3), propget] HRESULT UpdatePreviouslyMigratedObjects([out, retval] VARIANT_BOOL* pbUpdate);
		[id(4), propput] HRESULT FixGroupMembership([in] VARIANT_BOOL bFix);
		[id(4), propget] HRESULT FixGroupMembership([out, retval] VARIANT_BOOL* pbFix);
		[id(5), propput] HRESULT MigrateMembers([in] VARIANT_BOOL bMigrate);
		[id(5), propget] HRESULT MigrateMembers([out, retval] VARIANT_BOOL* pbMigrate);
		[id(6), propput] HRESULT DisableOption([in] long lOption);
		[id(6), propget] HRESULT DisableOption([out, retval] long* plOption);
		[id(7), propput] HRESULT SourceExpiration([in] long lExpiration);
		[id(7), propget] HRESULT SourceExpiration([out, retval] long* plExpiration);
		[id(8), propput] HRESULT TranslateRoamingProfile([in] VARIANT_BOOL bTranslate);
		[id(8), propget] HRESULT TranslateRoamingProfile([out, retval] VARIANT_BOOL* pbTranslate);
		[id(9)] HRESULT Migrate([in] long lOptions, [in, optional] VARIANT vntInclude, [in, optional] VARIANT vntExclude);
	};

	// IComputerMigration

	[
		object,
		uuid(FE808F47-442A-48E0-B9BB-471843C01018),
		dual,
		helpstring("IComputerMigration Interface"),
		pointer_default(unique)
	]
	interface IComputerMigration : IDispatch
	{
		[id( 1), propput] HRESULT TranslationOption([in] long lOption);
		[id( 1), propget] HRESULT TranslationOption([out, retval] long* plOption);
		[id( 2), propput] HRESULT TranslateFilesAndFolders([in] VARIANT_BOOL bTranslate);
		[id( 2), propget] HRESULT TranslateFilesAndFolders([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 3), propput] HRESULT TranslateLocalGroups([in] VARIANT_BOOL bTranslate);
		[id( 3), propget] HRESULT TranslateLocalGroups([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 4), propput] HRESULT TranslatePrinters([in] VARIANT_BOOL bTranslate);
		[id( 4), propget] HRESULT TranslatePrinters([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 5), propput] HRESULT TranslateRegistry([in] VARIANT_BOOL bTranslate);
		[id( 5), propget] HRESULT TranslateRegistry([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 6), propput] HRESULT TranslateShares([in] VARIANT_BOOL bTranslate);
		[id( 6), propget] HRESULT TranslateShares([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 7), propput] HRESULT TranslateUserProfiles([in] VARIANT_BOOL bTranslate);
		[id( 7), propget] HRESULT TranslateUserProfiles([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 8), propput] HRESULT TranslateUserRights([in] VARIANT_BOOL bTranslate);
		[id( 8), propget] HRESULT TranslateUserRights([out, retval] VARIANT_BOOL* pbTranslate);
		[id( 9), propput] HRESULT RestartDelay([in] long lTime);
		[id( 9), propget] HRESULT RestartDelay([out, retval] long* plTime);
		[id(10)] HRESULT Migrate([in] long lOptions, [in, optional] VARIANT vntInclude, [in, optional] VARIANT vntExclude);
	};

	// ISecurityTranslation

	[
		object,
		uuid(E7330F07-E140-43C3-A082-9DDE98CED9F4),
		dual,
		helpstring("ISecurityTranslation Interface"),
		pointer_default(unique)
	]
	interface ISecurityTranslation : IDispatch
	{
		[id( 1), propput] HRESULT TranslationOption([in] long lOption);
		[id( 1), propget] HRESULT TranslationOption([out, retval] long* lOption);
		[id( 2), propput] HRESULT TranslateFilesAndFolders([in] VARIANT_BOOL bTranslate);
		[id( 2), propget] HRESULT TranslateFilesAndFolders([out, retval] VARIANT_BOOL* bTranslate);
		[id( 3), propput] HRESULT TranslateLocalGroups([in] VARIANT_BOOL bTranslate);
		[id( 3), propget] HRESULT TranslateLocalGroups([out, retval] VARIANT_BOOL* bTranslate);
		[id( 4), propput] HRESULT TranslatePrinters([in] VARIANT_BOOL bTranslate);
		[id( 4), propget] HRESULT TranslatePrinters([out, retval] VARIANT_BOOL* bTranslate);
		[id( 5), propput] HRESULT TranslateRegistry([in] VARIANT_BOOL bTranslate);
		[id( 5), propget] HRESULT TranslateRegistry([out, retval] VARIANT_BOOL* bTranslate);
		[id( 6), propput] HRESULT TranslateShares([in] VARIANT_BOOL bTranslate);
		[id( 6), propget] HRESULT TranslateShares([out, retval] VARIANT_BOOL* bTranslate);
		[id( 7), propput] HRESULT TranslateUserProfiles([in] VARIANT_BOOL bTranslate);
		[id( 7), propget] HRESULT TranslateUserProfiles([out, retval] VARIANT_BOOL* bTranslate);
		[id( 8), propput] HRESULT TranslateUserRights([in] VARIANT_BOOL bTranslate);
		[id( 8), propget] HRESULT TranslateUserRights([out, retval] VARIANT_BOOL* bTranslate);
		[id( 9), propput] HRESULT SidMappingFile([in] BSTR bstrFile);
		[id( 9), propget] HRESULT SidMappingFile([out, retval] BSTR* pbstrFile);
		[id(10)] HRESULT Translate([in] long lOptions, [in, optional] VARIANT vntInclude, [in, optional] VARIANT vntExclude);
	};

	// IServiceAccountEnumeration

	[
		object,
		uuid(4AC4E39B-A2E8-4CA4-B54F-6BE9D8046C9B),
		dual,
		helpstring("IServiceAccountEnumeration Interface"),
		pointer_default(unique)
	]
	interface IServiceAccountEnumeration : IDispatch
	{
		[id(1)] HRESULT Enumerate([in] long lOptions, [in, optional] VARIANT vntInclude, [in, optional] VARIANT vntExclude);
	};

	// IReportGeneration

	[
		object,
		uuid(146D20A6-2093-4A58-97EC-E4D092124410),
		dual,
		helpstring("IReportGeneration Interface"),
		pointer_default(unique)
	]
	interface IReportGeneration : IDispatch
	{
		[id(1), propput] HRESULT Type([in] long lType);
		[id(1), propget] HRESULT Type([out, retval] long* plType);
		[id(2), propput] HRESULT Folder([in] BSTR bstrFolder);
		[id(2), propget] HRESULT Folder([out, retval] BSTR* pbstrFolder);
		[id(3)] HRESULT Generate([in] long lOptions, [in, optional] VARIANT vntInclude, [in, optional] VARIANT vntExclude);
	};

[
	uuid(28214D84-FBA0-4E65-A511-829AFC114191),
	version(1.0),
	helpstring("ADMT 1.0")
]
library ADMT
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

	enum RenameOption;
	enum PasswordOption;
	enum ConflictOptions;
	enum DisableOption;
	enum SourceExpiration;
	enum TranslateOption;
	enum ReportType;
	enum DataOptions;

	[
		uuid(285029CC-5048-4D90-8B38-22D304F513DC),
		helpstring("Migration Class")
	]
	coclass Migration
	{
		[default] interface IMigration;
	};
};
