/*** Autogenerated by WIDL 6.2 from include/wsmandisp.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wsmandisp_h__
#define __wsmandisp_h__

/* Forward declarations */

#ifndef __WSMan_FWD_DEFINED__
#define __WSMan_FWD_DEFINED__
#ifdef __cplusplus
typedef class WSMan WSMan;
#else
typedef struct WSMan WSMan;
#endif /* defined __cplusplus */
#endif /* defined __WSMan_FWD_DEFINED__ */

#ifndef __WSManInternal_FWD_DEFINED__
#define __WSManInternal_FWD_DEFINED__
#ifdef __cplusplus
typedef class WSManInternal WSManInternal;
#else
typedef struct WSManInternal WSManInternal;
#endif /* defined __cplusplus */
#endif /* defined __WSManInternal_FWD_DEFINED__ */

#ifndef __IWSMan_FWD_DEFINED__
#define __IWSMan_FWD_DEFINED__
typedef interface IWSMan IWSMan;
#ifdef __cplusplus
interface IWSMan;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEx_FWD_DEFINED__
#define __IWSManEx_FWD_DEFINED__
typedef interface IWSManEx IWSManEx;
#ifdef __cplusplus
interface IWSManEx;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEx2_FWD_DEFINED__
#define __IWSManEx2_FWD_DEFINED__
typedef interface IWSManEx2 IWSManEx2;
#ifdef __cplusplus
interface IWSManEx2;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEx3_FWD_DEFINED__
#define __IWSManEx3_FWD_DEFINED__
typedef interface IWSManEx3 IWSManEx3;
#ifdef __cplusplus
interface IWSManEx3;
#endif /* __cplusplus */
#endif

#ifndef __IWSManConnectionOptions_FWD_DEFINED__
#define __IWSManConnectionOptions_FWD_DEFINED__
typedef interface IWSManConnectionOptions IWSManConnectionOptions;
#ifdef __cplusplus
interface IWSManConnectionOptions;
#endif /* __cplusplus */
#endif

#ifndef __IWSManConnectionOptionsEx_FWD_DEFINED__
#define __IWSManConnectionOptionsEx_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx IWSManConnectionOptionsEx;
#ifdef __cplusplus
interface IWSManConnectionOptionsEx;
#endif /* __cplusplus */
#endif

#ifndef __IWSManConnectionOptionsEx2_FWD_DEFINED__
#define __IWSManConnectionOptionsEx2_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx2 IWSManConnectionOptionsEx2;
#ifdef __cplusplus
interface IWSManConnectionOptionsEx2;
#endif /* __cplusplus */
#endif

#ifndef __IWSManSession_FWD_DEFINED__
#define __IWSManSession_FWD_DEFINED__
typedef interface IWSManSession IWSManSession;
#ifdef __cplusplus
interface IWSManSession;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEnumerator_FWD_DEFINED__
#define __IWSManEnumerator_FWD_DEFINED__
typedef interface IWSManEnumerator IWSManEnumerator;
#ifdef __cplusplus
interface IWSManEnumerator;
#endif /* __cplusplus */
#endif

#ifndef __IWSManResourceLocator_FWD_DEFINED__
#define __IWSManResourceLocator_FWD_DEFINED__
typedef interface IWSManResourceLocator IWSManResourceLocator;
#ifdef __cplusplus
interface IWSManResourceLocator;
#endif /* __cplusplus */
#endif

#ifndef __IWSManResourceLocatorInternal_FWD_DEFINED__
#define __IWSManResourceLocatorInternal_FWD_DEFINED__
typedef interface IWSManResourceLocatorInternal IWSManResourceLocatorInternal;
#ifdef __cplusplus
interface IWSManResourceLocatorInternal;
#endif /* __cplusplus */
#endif

#ifndef __IWSManInternal_FWD_DEFINED__
#define __IWSManInternal_FWD_DEFINED__
typedef interface IWSManInternal IWSManInternal;
#ifdef __cplusplus
interface IWSManInternal;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __WSManAutomation_LIBRARY_DEFINED__
#define __WSManAutomation_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_WSManAutomation, 0xf010be25, 0x296d, 0x4036, 0x98,0x0f, 0x5a,0x06,0x69,0xa1,0x75,0x77);

typedef enum _WSManSessionFlags {
    WSManFlagUTF8 = 0x1,
    WSManFlagCredUsernamePassword = 0x1000,
    WSManFlagSkipCACheck = 0x2000,
    WSManFlagSkipCNCheck = 0x4000,
    WSManFlagUseNoAuthentication = 0x8000,
    WSManFlagUseDigest = 0x10000,
    WSManFlagUseNegotiate = 0x20000,
    WSManFlagUseBasic = 0x40000,
    WSManFlagUseKerberos = 0x80000,
    WSManFlagNoEncryption = 0x100000,
    WSManFlagUseClientCertificate = 0x200000,
    WSManFlagEnableSPNServerPort = 0x400000,
    WSManFlagUTF16 = 0x800000,
    WSManFlagUseCredSsp = 0x1000000,
    WSManFlagSkipRevocationCheck = 0x2000000,
    WSManFlagAllowNegotiateImplicitCredentials = 0x4000000,
    WSManFlagUseSsl = 0x8000000
} WSManSessionFlags;
typedef enum _WSManEnumFlags {
    WSManFlagReturnObject = 0x0,
    WSManFlagHierarchyDeep = 0x0,
    WSManFlagAssociatedInstance = 0x0,
    WSManFlagNonXmlText = 0x1,
    WSManFlagReturnEPR = 0x2,
    WSManFlagReturnObjectAndEPR = 0x4,
    WSManFlagHierarchyShallow = 0x20,
    WSManFlagHierarchyDeepBasePropsOnly = 0x40,
    WSManFlagAssociationInstance = 0x80
} WSManEnumFlags;
typedef enum _WSManProxyAccessTypeFlags {
    WSManProxyIEConfig = 0x1,
    WSManProxyWinHttpConfig = 0x2,
    WSManProxyAutoDetect = 0x4,
    WSManProxyNoProxyServer = 0x8
} WSManProxyAccessTypeFlags;
typedef enum _WSManProxyAuthenticationFlags {
    WSManFlagProxyAuthenticationUseNegotiate = 0x1,
    WSManFlagProxyAuthenticationUseBasic = 0x2,
    WSManFlagProxyAuthenticationUseDigest = 0x4
} WSManProxyAuthenticationFlags;
#ifndef __IWSMan_FWD_DEFINED__
#define __IWSMan_FWD_DEFINED__
typedef interface IWSMan IWSMan;
#ifdef __cplusplus
interface IWSMan;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEx_FWD_DEFINED__
#define __IWSManEx_FWD_DEFINED__
typedef interface IWSManEx IWSManEx;
#ifdef __cplusplus
interface IWSManEx;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEx2_FWD_DEFINED__
#define __IWSManEx2_FWD_DEFINED__
typedef interface IWSManEx2 IWSManEx2;
#ifdef __cplusplus
interface IWSManEx2;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEx3_FWD_DEFINED__
#define __IWSManEx3_FWD_DEFINED__
typedef interface IWSManEx3 IWSManEx3;
#ifdef __cplusplus
interface IWSManEx3;
#endif /* __cplusplus */
#endif

#ifndef __IWSManConnectionOptions_FWD_DEFINED__
#define __IWSManConnectionOptions_FWD_DEFINED__
typedef interface IWSManConnectionOptions IWSManConnectionOptions;
#ifdef __cplusplus
interface IWSManConnectionOptions;
#endif /* __cplusplus */
#endif

#ifndef __IWSManConnectionOptionsEx_FWD_DEFINED__
#define __IWSManConnectionOptionsEx_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx IWSManConnectionOptionsEx;
#ifdef __cplusplus
interface IWSManConnectionOptionsEx;
#endif /* __cplusplus */
#endif

#ifndef __IWSManConnectionOptionsEx2_FWD_DEFINED__
#define __IWSManConnectionOptionsEx2_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx2 IWSManConnectionOptionsEx2;
#ifdef __cplusplus
interface IWSManConnectionOptionsEx2;
#endif /* __cplusplus */
#endif

#ifndef __IWSManSession_FWD_DEFINED__
#define __IWSManSession_FWD_DEFINED__
typedef interface IWSManSession IWSManSession;
#ifdef __cplusplus
interface IWSManSession;
#endif /* __cplusplus */
#endif

#ifndef __IWSManSessionEx_FWD_DEFINED__
#define __IWSManSessionEx_FWD_DEFINED__
typedef interface IWSManSessionEx IWSManSessionEx;
#ifdef __cplusplus
interface IWSManSessionEx;
#endif /* __cplusplus */
#endif

#ifndef __IWSManEnumerator_FWD_DEFINED__
#define __IWSManEnumerator_FWD_DEFINED__
typedef interface IWSManEnumerator IWSManEnumerator;
#ifdef __cplusplus
interface IWSManEnumerator;
#endif /* __cplusplus */
#endif

#ifndef __IWSManResourceLocator_FWD_DEFINED__
#define __IWSManResourceLocator_FWD_DEFINED__
typedef interface IWSManResourceLocator IWSManResourceLocator;
#ifdef __cplusplus
interface IWSManResourceLocator;
#endif /* __cplusplus */
#endif

#ifndef __IWSManResourceLocatorInternal_FWD_DEFINED__
#define __IWSManResourceLocatorInternal_FWD_DEFINED__
typedef interface IWSManResourceLocatorInternal IWSManResourceLocatorInternal;
#ifdef __cplusplus
interface IWSManResourceLocatorInternal;
#endif /* __cplusplus */
#endif

#ifndef __IWSManInternal_FWD_DEFINED__
#define __IWSManInternal_FWD_DEFINED__
typedef interface IWSManInternal IWSManInternal;
#ifdef __cplusplus
interface IWSManInternal;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * WSMan coclass
 */

DEFINE_GUID(CLSID_WSMan, 0xbced617b, 0xec03, 0x420b, 0x85,0x08, 0x97,0x7d,0xc7,0xa6,0x86,0xbd);

#ifdef __cplusplus
class DECLSPEC_UUID("bced617b-ec03-420b-8508-977dc7a686bd") WSMan;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WSMan, 0xbced617b, 0xec03, 0x420b, 0x85,0x08, 0x97,0x7d,0xc7,0xa6,0x86,0xbd)
#endif
#endif

/*****************************************************************************
 * WSManInternal coclass
 */

DEFINE_GUID(CLSID_WSManInternal, 0x7de087a5, 0x5dcb, 0x4df7, 0xbb,0x12, 0x09,0x24,0xad,0x8f,0xbd,0x9a);

#ifdef __cplusplus
class DECLSPEC_UUID("7de087a5-5dcb-4df7-bb12-0924ad8fbd9a") WSManInternal;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WSManInternal, 0x7de087a5, 0x5dcb, 0x4df7, 0xbb,0x12, 0x09,0x24,0xad,0x8f,0xbd,0x9a)
#endif
#endif

#endif /* __WSManAutomation_LIBRARY_DEFINED__ */
/*****************************************************************************
 * IWSMan interface
 */
#ifndef __IWSMan_INTERFACE_DEFINED__
#define __IWSMan_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSMan, 0x190d8637, 0x5cd3, 0x496d, 0xad,0x24, 0x69,0x63,0x6b,0xb5,0xa3,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("190d8637-5cd3-496d-ad24-69636bb5a3b5")
IWSMan : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE CreateSession(
        BSTR connection,
        LONG flags,
        IDispatch *connectionOptions,
        IDispatch **session) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateConnectionOptions(
        IDispatch **connectionOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CommandLine(
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Error(
        BSTR *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSMan, 0x190d8637, 0x5cd3, 0x496d, 0xad,0x24, 0x69,0x63,0x6b,0xb5,0xa3,0xb5)
#endif
#else
typedef struct IWSManVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSMan *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSMan *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSMan *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSMan *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSMan *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSMan *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSMan *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSMan methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSession)(
        IWSMan *This,
        BSTR connection,
        LONG flags,
        IDispatch *connectionOptions,
        IDispatch **session);

    HRESULT (STDMETHODCALLTYPE *CreateConnectionOptions)(
        IWSMan *This,
        IDispatch **connectionOptions);

    HRESULT (STDMETHODCALLTYPE *get_CommandLine)(
        IWSMan *This,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSMan *This,
        BSTR *value);

    END_INTERFACE
} IWSManVtbl;

interface IWSMan {
    CONST_VTBL IWSManVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSMan_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSMan_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSMan_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSMan_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSMan_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSMan_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSMan_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSMan methods ***/
#define IWSMan_CreateSession(This,connection,flags,connectionOptions,session) (This)->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session)
#define IWSMan_CreateConnectionOptions(This,connectionOptions) (This)->lpVtbl->CreateConnectionOptions(This,connectionOptions)
#define IWSMan_get_CommandLine(This,value) (This)->lpVtbl->get_CommandLine(This,value)
#define IWSMan_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSMan_QueryInterface(IWSMan* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSMan_AddRef(IWSMan* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSMan_Release(IWSMan* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSMan_GetTypeInfoCount(IWSMan* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSMan_GetTypeInfo(IWSMan* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSMan_GetIDsOfNames(IWSMan* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSMan_Invoke(IWSMan* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSMan methods ***/
static FORCEINLINE HRESULT IWSMan_CreateSession(IWSMan* This,BSTR connection,LONG flags,IDispatch *connectionOptions,IDispatch **session) {
    return This->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session);
}
static FORCEINLINE HRESULT IWSMan_CreateConnectionOptions(IWSMan* This,IDispatch **connectionOptions) {
    return This->lpVtbl->CreateConnectionOptions(This,connectionOptions);
}
static FORCEINLINE HRESULT IWSMan_get_CommandLine(IWSMan* This,BSTR *value) {
    return This->lpVtbl->get_CommandLine(This,value);
}
static FORCEINLINE HRESULT IWSMan_get_Error(IWSMan* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
#endif
#endif

#endif


#endif  /* __IWSMan_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManEx interface
 */
#ifndef __IWSManEx_INTERFACE_DEFINED__
#define __IWSManEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManEx, 0x2d53bdaa, 0x798e, 0x49e6, 0xa1,0xaa, 0x74,0xd0,0x12,0x56,0xf4,0x11);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2d53bdaa-798e-49e6-a1aa-74d01256f411")
IWSManEx : public IWSMan
{
    virtual HRESULT STDMETHODCALLTYPE CreateResourceLocator(
        BSTR strResourceLocator,
        IDispatch **newResourceLocator) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUTF8(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagCredUsernamePassword(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagSkipCACheck(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagSkipCNCheck(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseDigest(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseNegotiate(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseBasic(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseKerberos(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagNoEncryption(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagEnableSPNServerPort(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseNoAuthentication(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagNonXmlText(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagReturnEPR(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagReturnObjectAndEPR(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetErrorMessage(
        DWORD errorNumber,
        BSTR *errorMessage) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagHierarchyDeep(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagHierarchyShallow(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagHierarchyDeepBasePropsOnly(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagReturnObject(
        LONG *flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManEx, 0x2d53bdaa, 0x798e, 0x49e6, 0xa1,0xaa, 0x74,0xd0,0x12,0x56,0xf4,0x11)
#endif
#else
typedef struct IWSManExVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManEx *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManEx *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManEx *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManEx *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManEx *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManEx *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManEx *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSMan methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSession)(
        IWSManEx *This,
        BSTR connection,
        LONG flags,
        IDispatch *connectionOptions,
        IDispatch **session);

    HRESULT (STDMETHODCALLTYPE *CreateConnectionOptions)(
        IWSManEx *This,
        IDispatch **connectionOptions);

    HRESULT (STDMETHODCALLTYPE *get_CommandLine)(
        IWSManEx *This,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSManEx *This,
        BSTR *value);

    /*** IWSManEx methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateResourceLocator)(
        IWSManEx *This,
        BSTR strResourceLocator,
        IDispatch **newResourceLocator);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUTF8)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagCredUsernamePassword)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipCACheck)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipCNCheck)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseDigest)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseNegotiate)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseBasic)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseKerberos)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagNoEncryption)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagEnableSPNServerPort)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseNoAuthentication)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagNonXmlText)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnEPR)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnObjectAndEPR)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *GetErrorMessage)(
        IWSManEx *This,
        DWORD errorNumber,
        BSTR *errorMessage);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyDeep)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyShallow)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyDeepBasePropsOnly)(
        IWSManEx *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnObject)(
        IWSManEx *This,
        LONG *flags);

    END_INTERFACE
} IWSManExVtbl;

interface IWSManEx {
    CONST_VTBL IWSManExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSMan methods ***/
#define IWSManEx_CreateSession(This,connection,flags,connectionOptions,session) (This)->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session)
#define IWSManEx_CreateConnectionOptions(This,connectionOptions) (This)->lpVtbl->CreateConnectionOptions(This,connectionOptions)
#define IWSManEx_get_CommandLine(This,value) (This)->lpVtbl->get_CommandLine(This,value)
#define IWSManEx_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
/*** IWSManEx methods ***/
#define IWSManEx_CreateResourceLocator(This,strResourceLocator,newResourceLocator) (This)->lpVtbl->CreateResourceLocator(This,strResourceLocator,newResourceLocator)
#define IWSManEx_SessionFlagUTF8(This,flags) (This)->lpVtbl->SessionFlagUTF8(This,flags)
#define IWSManEx_SessionFlagCredUsernamePassword(This,flags) (This)->lpVtbl->SessionFlagCredUsernamePassword(This,flags)
#define IWSManEx_SessionFlagSkipCACheck(This,flags) (This)->lpVtbl->SessionFlagSkipCACheck(This,flags)
#define IWSManEx_SessionFlagSkipCNCheck(This,flags) (This)->lpVtbl->SessionFlagSkipCNCheck(This,flags)
#define IWSManEx_SessionFlagUseDigest(This,flags) (This)->lpVtbl->SessionFlagUseDigest(This,flags)
#define IWSManEx_SessionFlagUseNegotiate(This,flags) (This)->lpVtbl->SessionFlagUseNegotiate(This,flags)
#define IWSManEx_SessionFlagUseBasic(This,flags) (This)->lpVtbl->SessionFlagUseBasic(This,flags)
#define IWSManEx_SessionFlagUseKerberos(This,flags) (This)->lpVtbl->SessionFlagUseKerberos(This,flags)
#define IWSManEx_SessionFlagNoEncryption(This,flags) (This)->lpVtbl->SessionFlagNoEncryption(This,flags)
#define IWSManEx_SessionFlagEnableSPNServerPort(This,flags) (This)->lpVtbl->SessionFlagEnableSPNServerPort(This,flags)
#define IWSManEx_SessionFlagUseNoAuthentication(This,flags) (This)->lpVtbl->SessionFlagUseNoAuthentication(This,flags)
#define IWSManEx_EnumerationFlagNonXmlText(This,flags) (This)->lpVtbl->EnumerationFlagNonXmlText(This,flags)
#define IWSManEx_EnumerationFlagReturnEPR(This,flags) (This)->lpVtbl->EnumerationFlagReturnEPR(This,flags)
#define IWSManEx_EnumerationFlagReturnObjectAndEPR(This,flags) (This)->lpVtbl->EnumerationFlagReturnObjectAndEPR(This,flags)
#define IWSManEx_GetErrorMessage(This,errorNumber,errorMessage) (This)->lpVtbl->GetErrorMessage(This,errorNumber,errorMessage)
#define IWSManEx_EnumerationFlagHierarchyDeep(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyDeep(This,flags)
#define IWSManEx_EnumerationFlagHierarchyShallow(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyShallow(This,flags)
#define IWSManEx_EnumerationFlagHierarchyDeepBasePropsOnly(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyDeepBasePropsOnly(This,flags)
#define IWSManEx_EnumerationFlagReturnObject(This,flags) (This)->lpVtbl->EnumerationFlagReturnObject(This,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManEx_QueryInterface(IWSManEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManEx_AddRef(IWSManEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManEx_Release(IWSManEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManEx_GetTypeInfoCount(IWSManEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManEx_GetTypeInfo(IWSManEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManEx_GetIDsOfNames(IWSManEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManEx_Invoke(IWSManEx* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSMan methods ***/
static FORCEINLINE HRESULT IWSManEx_CreateSession(IWSManEx* This,BSTR connection,LONG flags,IDispatch *connectionOptions,IDispatch **session) {
    return This->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session);
}
static FORCEINLINE HRESULT IWSManEx_CreateConnectionOptions(IWSManEx* This,IDispatch **connectionOptions) {
    return This->lpVtbl->CreateConnectionOptions(This,connectionOptions);
}
static FORCEINLINE HRESULT IWSManEx_get_CommandLine(IWSManEx* This,BSTR *value) {
    return This->lpVtbl->get_CommandLine(This,value);
}
static FORCEINLINE HRESULT IWSManEx_get_Error(IWSManEx* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
/*** IWSManEx methods ***/
static FORCEINLINE HRESULT IWSManEx_CreateResourceLocator(IWSManEx* This,BSTR strResourceLocator,IDispatch **newResourceLocator) {
    return This->lpVtbl->CreateResourceLocator(This,strResourceLocator,newResourceLocator);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagUTF8(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUTF8(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagCredUsernamePassword(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagCredUsernamePassword(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagSkipCACheck(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipCACheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagSkipCNCheck(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipCNCheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagUseDigest(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseDigest(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagUseNegotiate(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseNegotiate(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagUseBasic(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseBasic(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagUseKerberos(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseKerberos(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagNoEncryption(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagNoEncryption(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagEnableSPNServerPort(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagEnableSPNServerPort(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_SessionFlagUseNoAuthentication(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseNoAuthentication(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagNonXmlText(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagNonXmlText(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagReturnEPR(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnEPR(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagReturnObjectAndEPR(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnObjectAndEPR(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_GetErrorMessage(IWSManEx* This,DWORD errorNumber,BSTR *errorMessage) {
    return This->lpVtbl->GetErrorMessage(This,errorNumber,errorMessage);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagHierarchyDeep(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyDeep(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagHierarchyShallow(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyShallow(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagHierarchyDeepBasePropsOnly(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyDeepBasePropsOnly(This,flags);
}
static FORCEINLINE HRESULT IWSManEx_EnumerationFlagReturnObject(IWSManEx* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnObject(This,flags);
}
#endif
#endif

#endif


#endif  /* __IWSManEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManEx2 interface
 */
#ifndef __IWSManEx2_INTERFACE_DEFINED__
#define __IWSManEx2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManEx2, 0x1d1b5ae0, 0x42d9, 0x4021, 0x82,0x61, 0x39,0x87,0x61,0x95,0x12,0xe9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1d1b5ae0-42d9-4021-8261-3987619512e9")
IWSManEx2 : public IWSManEx
{
    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseClientCertificate(
        LONG *flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManEx2, 0x1d1b5ae0, 0x42d9, 0x4021, 0x82,0x61, 0x39,0x87,0x61,0x95,0x12,0xe9)
#endif
#else
typedef struct IWSManEx2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManEx2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManEx2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManEx2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManEx2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManEx2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManEx2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManEx2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSMan methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSession)(
        IWSManEx2 *This,
        BSTR connection,
        LONG flags,
        IDispatch *connectionOptions,
        IDispatch **session);

    HRESULT (STDMETHODCALLTYPE *CreateConnectionOptions)(
        IWSManEx2 *This,
        IDispatch **connectionOptions);

    HRESULT (STDMETHODCALLTYPE *get_CommandLine)(
        IWSManEx2 *This,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSManEx2 *This,
        BSTR *value);

    /*** IWSManEx methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateResourceLocator)(
        IWSManEx2 *This,
        BSTR strResourceLocator,
        IDispatch **newResourceLocator);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUTF8)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagCredUsernamePassword)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipCACheck)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipCNCheck)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseDigest)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseNegotiate)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseBasic)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseKerberos)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagNoEncryption)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagEnableSPNServerPort)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseNoAuthentication)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagNonXmlText)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnEPR)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnObjectAndEPR)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *GetErrorMessage)(
        IWSManEx2 *This,
        DWORD errorNumber,
        BSTR *errorMessage);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyDeep)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyShallow)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyDeepBasePropsOnly)(
        IWSManEx2 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnObject)(
        IWSManEx2 *This,
        LONG *flags);

    /*** IWSManEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SessionFlagUseClientCertificate)(
        IWSManEx2 *This,
        LONG *flags);

    END_INTERFACE
} IWSManEx2Vtbl;

interface IWSManEx2 {
    CONST_VTBL IWSManEx2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManEx2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManEx2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManEx2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManEx2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManEx2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManEx2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManEx2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSMan methods ***/
#define IWSManEx2_CreateSession(This,connection,flags,connectionOptions,session) (This)->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session)
#define IWSManEx2_CreateConnectionOptions(This,connectionOptions) (This)->lpVtbl->CreateConnectionOptions(This,connectionOptions)
#define IWSManEx2_get_CommandLine(This,value) (This)->lpVtbl->get_CommandLine(This,value)
#define IWSManEx2_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
/*** IWSManEx methods ***/
#define IWSManEx2_CreateResourceLocator(This,strResourceLocator,newResourceLocator) (This)->lpVtbl->CreateResourceLocator(This,strResourceLocator,newResourceLocator)
#define IWSManEx2_SessionFlagUTF8(This,flags) (This)->lpVtbl->SessionFlagUTF8(This,flags)
#define IWSManEx2_SessionFlagCredUsernamePassword(This,flags) (This)->lpVtbl->SessionFlagCredUsernamePassword(This,flags)
#define IWSManEx2_SessionFlagSkipCACheck(This,flags) (This)->lpVtbl->SessionFlagSkipCACheck(This,flags)
#define IWSManEx2_SessionFlagSkipCNCheck(This,flags) (This)->lpVtbl->SessionFlagSkipCNCheck(This,flags)
#define IWSManEx2_SessionFlagUseDigest(This,flags) (This)->lpVtbl->SessionFlagUseDigest(This,flags)
#define IWSManEx2_SessionFlagUseNegotiate(This,flags) (This)->lpVtbl->SessionFlagUseNegotiate(This,flags)
#define IWSManEx2_SessionFlagUseBasic(This,flags) (This)->lpVtbl->SessionFlagUseBasic(This,flags)
#define IWSManEx2_SessionFlagUseKerberos(This,flags) (This)->lpVtbl->SessionFlagUseKerberos(This,flags)
#define IWSManEx2_SessionFlagNoEncryption(This,flags) (This)->lpVtbl->SessionFlagNoEncryption(This,flags)
#define IWSManEx2_SessionFlagEnableSPNServerPort(This,flags) (This)->lpVtbl->SessionFlagEnableSPNServerPort(This,flags)
#define IWSManEx2_SessionFlagUseNoAuthentication(This,flags) (This)->lpVtbl->SessionFlagUseNoAuthentication(This,flags)
#define IWSManEx2_EnumerationFlagNonXmlText(This,flags) (This)->lpVtbl->EnumerationFlagNonXmlText(This,flags)
#define IWSManEx2_EnumerationFlagReturnEPR(This,flags) (This)->lpVtbl->EnumerationFlagReturnEPR(This,flags)
#define IWSManEx2_EnumerationFlagReturnObjectAndEPR(This,flags) (This)->lpVtbl->EnumerationFlagReturnObjectAndEPR(This,flags)
#define IWSManEx2_GetErrorMessage(This,errorNumber,errorMessage) (This)->lpVtbl->GetErrorMessage(This,errorNumber,errorMessage)
#define IWSManEx2_EnumerationFlagHierarchyDeep(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyDeep(This,flags)
#define IWSManEx2_EnumerationFlagHierarchyShallow(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyShallow(This,flags)
#define IWSManEx2_EnumerationFlagHierarchyDeepBasePropsOnly(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyDeepBasePropsOnly(This,flags)
#define IWSManEx2_EnumerationFlagReturnObject(This,flags) (This)->lpVtbl->EnumerationFlagReturnObject(This,flags)
/*** IWSManEx2 methods ***/
#define IWSManEx2_SessionFlagUseClientCertificate(This,flags) (This)->lpVtbl->SessionFlagUseClientCertificate(This,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManEx2_QueryInterface(IWSManEx2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManEx2_AddRef(IWSManEx2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManEx2_Release(IWSManEx2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManEx2_GetTypeInfoCount(IWSManEx2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManEx2_GetTypeInfo(IWSManEx2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManEx2_GetIDsOfNames(IWSManEx2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManEx2_Invoke(IWSManEx2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSMan methods ***/
static FORCEINLINE HRESULT IWSManEx2_CreateSession(IWSManEx2* This,BSTR connection,LONG flags,IDispatch *connectionOptions,IDispatch **session) {
    return This->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session);
}
static FORCEINLINE HRESULT IWSManEx2_CreateConnectionOptions(IWSManEx2* This,IDispatch **connectionOptions) {
    return This->lpVtbl->CreateConnectionOptions(This,connectionOptions);
}
static FORCEINLINE HRESULT IWSManEx2_get_CommandLine(IWSManEx2* This,BSTR *value) {
    return This->lpVtbl->get_CommandLine(This,value);
}
static FORCEINLINE HRESULT IWSManEx2_get_Error(IWSManEx2* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
/*** IWSManEx methods ***/
static FORCEINLINE HRESULT IWSManEx2_CreateResourceLocator(IWSManEx2* This,BSTR strResourceLocator,IDispatch **newResourceLocator) {
    return This->lpVtbl->CreateResourceLocator(This,strResourceLocator,newResourceLocator);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUTF8(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUTF8(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagCredUsernamePassword(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagCredUsernamePassword(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagSkipCACheck(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipCACheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagSkipCNCheck(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipCNCheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUseDigest(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseDigest(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUseNegotiate(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseNegotiate(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUseBasic(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseBasic(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUseKerberos(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseKerberos(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagNoEncryption(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagNoEncryption(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagEnableSPNServerPort(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagEnableSPNServerPort(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUseNoAuthentication(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseNoAuthentication(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagNonXmlText(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagNonXmlText(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagReturnEPR(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnEPR(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagReturnObjectAndEPR(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnObjectAndEPR(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_GetErrorMessage(IWSManEx2* This,DWORD errorNumber,BSTR *errorMessage) {
    return This->lpVtbl->GetErrorMessage(This,errorNumber,errorMessage);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagHierarchyDeep(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyDeep(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagHierarchyShallow(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyShallow(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagHierarchyDeepBasePropsOnly(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyDeepBasePropsOnly(This,flags);
}
static FORCEINLINE HRESULT IWSManEx2_EnumerationFlagReturnObject(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnObject(This,flags);
}
/*** IWSManEx2 methods ***/
static FORCEINLINE HRESULT IWSManEx2_SessionFlagUseClientCertificate(IWSManEx2* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseClientCertificate(This,flags);
}
#endif
#endif

#endif


#endif  /* __IWSManEx2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManEx3 interface
 */
#ifndef __IWSManEx3_INTERFACE_DEFINED__
#define __IWSManEx3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManEx3, 0x6400e966, 0x011d, 0x4eac, 0x84,0x74, 0x04,0x9e,0x08,0x48,0xaf,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6400e966-011d-4eac-8474-049e0848afad")
IWSManEx3 : public IWSManEx2
{
    virtual HRESULT STDMETHODCALLTYPE SessionFlagUTF16(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseCredSsp(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagAssociationInstance(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerationFlagAssociatedInstance(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagSkipRevocationCheck(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagAllowNegotiateImplicitCredentials(
        LONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SessionFlagUseSsl(
        LONG *flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManEx3, 0x6400e966, 0x011d, 0x4eac, 0x84,0x74, 0x04,0x9e,0x08,0x48,0xaf,0xad)
#endif
#else
typedef struct IWSManEx3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManEx3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManEx3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManEx3 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManEx3 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManEx3 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManEx3 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManEx3 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSMan methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSession)(
        IWSManEx3 *This,
        BSTR connection,
        LONG flags,
        IDispatch *connectionOptions,
        IDispatch **session);

    HRESULT (STDMETHODCALLTYPE *CreateConnectionOptions)(
        IWSManEx3 *This,
        IDispatch **connectionOptions);

    HRESULT (STDMETHODCALLTYPE *get_CommandLine)(
        IWSManEx3 *This,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSManEx3 *This,
        BSTR *value);

    /*** IWSManEx methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateResourceLocator)(
        IWSManEx3 *This,
        BSTR strResourceLocator,
        IDispatch **newResourceLocator);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUTF8)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagCredUsernamePassword)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipCACheck)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipCNCheck)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseDigest)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseNegotiate)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseBasic)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseKerberos)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagNoEncryption)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagEnableSPNServerPort)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseNoAuthentication)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagNonXmlText)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnEPR)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnObjectAndEPR)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *GetErrorMessage)(
        IWSManEx3 *This,
        DWORD errorNumber,
        BSTR *errorMessage);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyDeep)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyShallow)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagHierarchyDeepBasePropsOnly)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagReturnObject)(
        IWSManEx3 *This,
        LONG *flags);

    /*** IWSManEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SessionFlagUseClientCertificate)(
        IWSManEx3 *This,
        LONG *flags);

    /*** IWSManEx3 methods ***/
    HRESULT (STDMETHODCALLTYPE *SessionFlagUTF16)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseCredSsp)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagAssociationInstance)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *EnumerationFlagAssociatedInstance)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagSkipRevocationCheck)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagAllowNegotiateImplicitCredentials)(
        IWSManEx3 *This,
        LONG *flags);

    HRESULT (STDMETHODCALLTYPE *SessionFlagUseSsl)(
        IWSManEx3 *This,
        LONG *flags);

    END_INTERFACE
} IWSManEx3Vtbl;

interface IWSManEx3 {
    CONST_VTBL IWSManEx3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManEx3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManEx3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManEx3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManEx3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManEx3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManEx3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManEx3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSMan methods ***/
#define IWSManEx3_CreateSession(This,connection,flags,connectionOptions,session) (This)->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session)
#define IWSManEx3_CreateConnectionOptions(This,connectionOptions) (This)->lpVtbl->CreateConnectionOptions(This,connectionOptions)
#define IWSManEx3_get_CommandLine(This,value) (This)->lpVtbl->get_CommandLine(This,value)
#define IWSManEx3_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
/*** IWSManEx methods ***/
#define IWSManEx3_CreateResourceLocator(This,strResourceLocator,newResourceLocator) (This)->lpVtbl->CreateResourceLocator(This,strResourceLocator,newResourceLocator)
#define IWSManEx3_SessionFlagUTF8(This,flags) (This)->lpVtbl->SessionFlagUTF8(This,flags)
#define IWSManEx3_SessionFlagCredUsernamePassword(This,flags) (This)->lpVtbl->SessionFlagCredUsernamePassword(This,flags)
#define IWSManEx3_SessionFlagSkipCACheck(This,flags) (This)->lpVtbl->SessionFlagSkipCACheck(This,flags)
#define IWSManEx3_SessionFlagSkipCNCheck(This,flags) (This)->lpVtbl->SessionFlagSkipCNCheck(This,flags)
#define IWSManEx3_SessionFlagUseDigest(This,flags) (This)->lpVtbl->SessionFlagUseDigest(This,flags)
#define IWSManEx3_SessionFlagUseNegotiate(This,flags) (This)->lpVtbl->SessionFlagUseNegotiate(This,flags)
#define IWSManEx3_SessionFlagUseBasic(This,flags) (This)->lpVtbl->SessionFlagUseBasic(This,flags)
#define IWSManEx3_SessionFlagUseKerberos(This,flags) (This)->lpVtbl->SessionFlagUseKerberos(This,flags)
#define IWSManEx3_SessionFlagNoEncryption(This,flags) (This)->lpVtbl->SessionFlagNoEncryption(This,flags)
#define IWSManEx3_SessionFlagEnableSPNServerPort(This,flags) (This)->lpVtbl->SessionFlagEnableSPNServerPort(This,flags)
#define IWSManEx3_SessionFlagUseNoAuthentication(This,flags) (This)->lpVtbl->SessionFlagUseNoAuthentication(This,flags)
#define IWSManEx3_EnumerationFlagNonXmlText(This,flags) (This)->lpVtbl->EnumerationFlagNonXmlText(This,flags)
#define IWSManEx3_EnumerationFlagReturnEPR(This,flags) (This)->lpVtbl->EnumerationFlagReturnEPR(This,flags)
#define IWSManEx3_EnumerationFlagReturnObjectAndEPR(This,flags) (This)->lpVtbl->EnumerationFlagReturnObjectAndEPR(This,flags)
#define IWSManEx3_GetErrorMessage(This,errorNumber,errorMessage) (This)->lpVtbl->GetErrorMessage(This,errorNumber,errorMessage)
#define IWSManEx3_EnumerationFlagHierarchyDeep(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyDeep(This,flags)
#define IWSManEx3_EnumerationFlagHierarchyShallow(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyShallow(This,flags)
#define IWSManEx3_EnumerationFlagHierarchyDeepBasePropsOnly(This,flags) (This)->lpVtbl->EnumerationFlagHierarchyDeepBasePropsOnly(This,flags)
#define IWSManEx3_EnumerationFlagReturnObject(This,flags) (This)->lpVtbl->EnumerationFlagReturnObject(This,flags)
/*** IWSManEx2 methods ***/
#define IWSManEx3_SessionFlagUseClientCertificate(This,flags) (This)->lpVtbl->SessionFlagUseClientCertificate(This,flags)
/*** IWSManEx3 methods ***/
#define IWSManEx3_SessionFlagUTF16(This,flags) (This)->lpVtbl->SessionFlagUTF16(This,flags)
#define IWSManEx3_SessionFlagUseCredSsp(This,flags) (This)->lpVtbl->SessionFlagUseCredSsp(This,flags)
#define IWSManEx3_EnumerationFlagAssociationInstance(This,flags) (This)->lpVtbl->EnumerationFlagAssociationInstance(This,flags)
#define IWSManEx3_EnumerationFlagAssociatedInstance(This,flags) (This)->lpVtbl->EnumerationFlagAssociatedInstance(This,flags)
#define IWSManEx3_SessionFlagSkipRevocationCheck(This,flags) (This)->lpVtbl->SessionFlagSkipRevocationCheck(This,flags)
#define IWSManEx3_SessionFlagAllowNegotiateImplicitCredentials(This,flags) (This)->lpVtbl->SessionFlagAllowNegotiateImplicitCredentials(This,flags)
#define IWSManEx3_SessionFlagUseSsl(This,flags) (This)->lpVtbl->SessionFlagUseSsl(This,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManEx3_QueryInterface(IWSManEx3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManEx3_AddRef(IWSManEx3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManEx3_Release(IWSManEx3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManEx3_GetTypeInfoCount(IWSManEx3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManEx3_GetTypeInfo(IWSManEx3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManEx3_GetIDsOfNames(IWSManEx3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManEx3_Invoke(IWSManEx3* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSMan methods ***/
static FORCEINLINE HRESULT IWSManEx3_CreateSession(IWSManEx3* This,BSTR connection,LONG flags,IDispatch *connectionOptions,IDispatch **session) {
    return This->lpVtbl->CreateSession(This,connection,flags,connectionOptions,session);
}
static FORCEINLINE HRESULT IWSManEx3_CreateConnectionOptions(IWSManEx3* This,IDispatch **connectionOptions) {
    return This->lpVtbl->CreateConnectionOptions(This,connectionOptions);
}
static FORCEINLINE HRESULT IWSManEx3_get_CommandLine(IWSManEx3* This,BSTR *value) {
    return This->lpVtbl->get_CommandLine(This,value);
}
static FORCEINLINE HRESULT IWSManEx3_get_Error(IWSManEx3* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
/*** IWSManEx methods ***/
static FORCEINLINE HRESULT IWSManEx3_CreateResourceLocator(IWSManEx3* This,BSTR strResourceLocator,IDispatch **newResourceLocator) {
    return This->lpVtbl->CreateResourceLocator(This,strResourceLocator,newResourceLocator);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUTF8(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUTF8(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagCredUsernamePassword(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagCredUsernamePassword(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagSkipCACheck(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipCACheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagSkipCNCheck(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipCNCheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseDigest(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseDigest(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseNegotiate(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseNegotiate(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseBasic(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseBasic(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseKerberos(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseKerberos(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagNoEncryption(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagNoEncryption(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagEnableSPNServerPort(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagEnableSPNServerPort(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseNoAuthentication(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseNoAuthentication(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagNonXmlText(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagNonXmlText(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagReturnEPR(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnEPR(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagReturnObjectAndEPR(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnObjectAndEPR(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_GetErrorMessage(IWSManEx3* This,DWORD errorNumber,BSTR *errorMessage) {
    return This->lpVtbl->GetErrorMessage(This,errorNumber,errorMessage);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagHierarchyDeep(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyDeep(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagHierarchyShallow(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyShallow(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagHierarchyDeepBasePropsOnly(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagHierarchyDeepBasePropsOnly(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagReturnObject(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagReturnObject(This,flags);
}
/*** IWSManEx2 methods ***/
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseClientCertificate(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseClientCertificate(This,flags);
}
/*** IWSManEx3 methods ***/
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUTF16(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUTF16(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseCredSsp(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseCredSsp(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagAssociationInstance(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagAssociationInstance(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_EnumerationFlagAssociatedInstance(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->EnumerationFlagAssociatedInstance(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagSkipRevocationCheck(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagSkipRevocationCheck(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagAllowNegotiateImplicitCredentials(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagAllowNegotiateImplicitCredentials(This,flags);
}
static FORCEINLINE HRESULT IWSManEx3_SessionFlagUseSsl(IWSManEx3* This,LONG *flags) {
    return This->lpVtbl->SessionFlagUseSsl(This,flags);
}
#endif
#endif

#endif


#endif  /* __IWSManEx3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManConnectionOptions interface
 */
#ifndef __IWSManConnectionOptions_INTERFACE_DEFINED__
#define __IWSManConnectionOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManConnectionOptions, 0xf704e861, 0x9e52, 0x464f, 0xb7,0x86, 0xda,0x5e,0xb2,0x32,0x0f,0xdd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f704e861-9e52-464f-b786-da5eb2320fdd")
IWSManConnectionOptions : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_UserName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_UserName(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Password(
        BSTR password) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManConnectionOptions, 0xf704e861, 0x9e52, 0x464f, 0xb7,0x86, 0xda,0x5e,0xb2,0x32,0x0f,0xdd)
#endif
#else
typedef struct IWSManConnectionOptionsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManConnectionOptions *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManConnectionOptions *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManConnectionOptions *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManConnectionOptions *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManConnectionOptions *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManConnectionOptions *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManConnectionOptions *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManConnectionOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserName)(
        IWSManConnectionOptions *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_UserName)(
        IWSManConnectionOptions *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *put_Password)(
        IWSManConnectionOptions *This,
        BSTR password);

    END_INTERFACE
} IWSManConnectionOptionsVtbl;

interface IWSManConnectionOptions {
    CONST_VTBL IWSManConnectionOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManConnectionOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManConnectionOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManConnectionOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManConnectionOptions_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManConnectionOptions_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManConnectionOptions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManConnectionOptions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSManConnectionOptions methods ***/
#define IWSManConnectionOptions_get_UserName(This,name) (This)->lpVtbl->get_UserName(This,name)
#define IWSManConnectionOptions_put_UserName(This,name) (This)->lpVtbl->put_UserName(This,name)
#define IWSManConnectionOptions_put_Password(This,password) (This)->lpVtbl->put_Password(This,password)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptions_QueryInterface(IWSManConnectionOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManConnectionOptions_AddRef(IWSManConnectionOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManConnectionOptions_Release(IWSManConnectionOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptions_GetTypeInfoCount(IWSManConnectionOptions* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManConnectionOptions_GetTypeInfo(IWSManConnectionOptions* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManConnectionOptions_GetIDsOfNames(IWSManConnectionOptions* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManConnectionOptions_Invoke(IWSManConnectionOptions* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSManConnectionOptions methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptions_get_UserName(IWSManConnectionOptions* This,BSTR *name) {
    return This->lpVtbl->get_UserName(This,name);
}
static FORCEINLINE HRESULT IWSManConnectionOptions_put_UserName(IWSManConnectionOptions* This,BSTR name) {
    return This->lpVtbl->put_UserName(This,name);
}
static FORCEINLINE HRESULT IWSManConnectionOptions_put_Password(IWSManConnectionOptions* This,BSTR password) {
    return This->lpVtbl->put_Password(This,password);
}
#endif
#endif

#endif


#endif  /* __IWSManConnectionOptions_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManConnectionOptionsEx interface
 */
#ifndef __IWSManConnectionOptionsEx_INTERFACE_DEFINED__
#define __IWSManConnectionOptionsEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManConnectionOptionsEx, 0xef43edf7, 0x2a48, 0x4d93, 0x95,0x26, 0x8b,0xd6,0xab,0x6d,0x4a,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ef43edf7-2a48-4d93-9526-8bd6ab6d4a6b")
IWSManConnectionOptionsEx : public IWSManConnectionOptions
{
    virtual HRESULT STDMETHODCALLTYPE get_CertificateThumbprint(
        BSTR *thumbprint) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CertificateThumbprint(
        BSTR thumbprint) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManConnectionOptionsEx, 0xef43edf7, 0x2a48, 0x4d93, 0x95,0x26, 0x8b,0xd6,0xab,0x6d,0x4a,0x6b)
#endif
#else
typedef struct IWSManConnectionOptionsExVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManConnectionOptionsEx *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManConnectionOptionsEx *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManConnectionOptionsEx *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManConnectionOptionsEx *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManConnectionOptionsEx *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManConnectionOptionsEx *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManConnectionOptionsEx *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManConnectionOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserName)(
        IWSManConnectionOptionsEx *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_UserName)(
        IWSManConnectionOptionsEx *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *put_Password)(
        IWSManConnectionOptionsEx *This,
        BSTR password);

    /*** IWSManConnectionOptionsEx methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CertificateThumbprint)(
        IWSManConnectionOptionsEx *This,
        BSTR *thumbprint);

    HRESULT (STDMETHODCALLTYPE *put_CertificateThumbprint)(
        IWSManConnectionOptionsEx *This,
        BSTR thumbprint);

    END_INTERFACE
} IWSManConnectionOptionsExVtbl;

interface IWSManConnectionOptionsEx {
    CONST_VTBL IWSManConnectionOptionsExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManConnectionOptionsEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManConnectionOptionsEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManConnectionOptionsEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManConnectionOptionsEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManConnectionOptionsEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManConnectionOptionsEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManConnectionOptionsEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSManConnectionOptions methods ***/
#define IWSManConnectionOptionsEx_get_UserName(This,name) (This)->lpVtbl->get_UserName(This,name)
#define IWSManConnectionOptionsEx_put_UserName(This,name) (This)->lpVtbl->put_UserName(This,name)
#define IWSManConnectionOptionsEx_put_Password(This,password) (This)->lpVtbl->put_Password(This,password)
/*** IWSManConnectionOptionsEx methods ***/
#define IWSManConnectionOptionsEx_get_CertificateThumbprint(This,thumbprint) (This)->lpVtbl->get_CertificateThumbprint(This,thumbprint)
#define IWSManConnectionOptionsEx_put_CertificateThumbprint(This,thumbprint) (This)->lpVtbl->put_CertificateThumbprint(This,thumbprint)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_QueryInterface(IWSManConnectionOptionsEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManConnectionOptionsEx_AddRef(IWSManConnectionOptionsEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManConnectionOptionsEx_Release(IWSManConnectionOptionsEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_GetTypeInfoCount(IWSManConnectionOptionsEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_GetTypeInfo(IWSManConnectionOptionsEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_GetIDsOfNames(IWSManConnectionOptionsEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_Invoke(IWSManConnectionOptionsEx* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSManConnectionOptions methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_get_UserName(IWSManConnectionOptionsEx* This,BSTR *name) {
    return This->lpVtbl->get_UserName(This,name);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_put_UserName(IWSManConnectionOptionsEx* This,BSTR name) {
    return This->lpVtbl->put_UserName(This,name);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_put_Password(IWSManConnectionOptionsEx* This,BSTR password) {
    return This->lpVtbl->put_Password(This,password);
}
/*** IWSManConnectionOptionsEx methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_get_CertificateThumbprint(IWSManConnectionOptionsEx* This,BSTR *thumbprint) {
    return This->lpVtbl->get_CertificateThumbprint(This,thumbprint);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx_put_CertificateThumbprint(IWSManConnectionOptionsEx* This,BSTR thumbprint) {
    return This->lpVtbl->put_CertificateThumbprint(This,thumbprint);
}
#endif
#endif

#endif


#endif  /* __IWSManConnectionOptionsEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManConnectionOptionsEx2 interface
 */
#ifndef __IWSManConnectionOptionsEx2_INTERFACE_DEFINED__
#define __IWSManConnectionOptionsEx2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManConnectionOptionsEx2, 0xf500c9ec, 0x24ee, 0x48ab, 0xb3,0x8d, 0xfc,0x9a,0x16,0x4c,0x65,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f500c9ec-24ee-48ab-b38d-fc9a164c658e")
IWSManConnectionOptionsEx2 : public IWSManConnectionOptionsEx
{
    virtual HRESULT STDMETHODCALLTYPE SetProxy(
        LONG accessType = 0,
        LONG authenticationMechanism = 0,
        BSTR userName = L"",
        BSTR password = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyIEConfig(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyWinHttpConfig(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyAutoDetect(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyNoProxyServer(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyAuthenticationUseNegotiate(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyAuthenticationUseBasic(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProxyAuthenticationUseDigest(
        LONG *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManConnectionOptionsEx2, 0xf500c9ec, 0x24ee, 0x48ab, 0xb3,0x8d, 0xfc,0x9a,0x16,0x4c,0x65,0x8e)
#endif
#else
typedef struct IWSManConnectionOptionsEx2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManConnectionOptionsEx2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManConnectionOptionsEx2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManConnectionOptionsEx2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManConnectionOptionsEx2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManConnectionOptionsEx2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManConnectionOptionsEx2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManConnectionOptionsEx2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManConnectionOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserName)(
        IWSManConnectionOptionsEx2 *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_UserName)(
        IWSManConnectionOptionsEx2 *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *put_Password)(
        IWSManConnectionOptionsEx2 *This,
        BSTR password);

    /*** IWSManConnectionOptionsEx methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CertificateThumbprint)(
        IWSManConnectionOptionsEx2 *This,
        BSTR *thumbprint);

    HRESULT (STDMETHODCALLTYPE *put_CertificateThumbprint)(
        IWSManConnectionOptionsEx2 *This,
        BSTR thumbprint);

    /*** IWSManConnectionOptionsEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProxy)(
        IWSManConnectionOptionsEx2 *This,
        LONG accessType,
        LONG authenticationMechanism,
        BSTR userName,
        BSTR password);

    HRESULT (STDMETHODCALLTYPE *ProxyIEConfig)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *ProxyWinHttpConfig)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *ProxyAutoDetect)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *ProxyNoProxyServer)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *ProxyAuthenticationUseNegotiate)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *ProxyAuthenticationUseBasic)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *ProxyAuthenticationUseDigest)(
        IWSManConnectionOptionsEx2 *This,
        LONG *value);

    END_INTERFACE
} IWSManConnectionOptionsEx2Vtbl;

interface IWSManConnectionOptionsEx2 {
    CONST_VTBL IWSManConnectionOptionsEx2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManConnectionOptionsEx2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManConnectionOptionsEx2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManConnectionOptionsEx2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManConnectionOptionsEx2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManConnectionOptionsEx2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManConnectionOptionsEx2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManConnectionOptionsEx2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSManConnectionOptions methods ***/
#define IWSManConnectionOptionsEx2_get_UserName(This,name) (This)->lpVtbl->get_UserName(This,name)
#define IWSManConnectionOptionsEx2_put_UserName(This,name) (This)->lpVtbl->put_UserName(This,name)
#define IWSManConnectionOptionsEx2_put_Password(This,password) (This)->lpVtbl->put_Password(This,password)
/*** IWSManConnectionOptionsEx methods ***/
#define IWSManConnectionOptionsEx2_get_CertificateThumbprint(This,thumbprint) (This)->lpVtbl->get_CertificateThumbprint(This,thumbprint)
#define IWSManConnectionOptionsEx2_put_CertificateThumbprint(This,thumbprint) (This)->lpVtbl->put_CertificateThumbprint(This,thumbprint)
/*** IWSManConnectionOptionsEx2 methods ***/
#define IWSManConnectionOptionsEx2_SetProxy(This,accessType,authenticationMechanism,userName,password) (This)->lpVtbl->SetProxy(This,accessType,authenticationMechanism,userName,password)
#define IWSManConnectionOptionsEx2_ProxyIEConfig(This,value) (This)->lpVtbl->ProxyIEConfig(This,value)
#define IWSManConnectionOptionsEx2_ProxyWinHttpConfig(This,value) (This)->lpVtbl->ProxyWinHttpConfig(This,value)
#define IWSManConnectionOptionsEx2_ProxyAutoDetect(This,value) (This)->lpVtbl->ProxyAutoDetect(This,value)
#define IWSManConnectionOptionsEx2_ProxyNoProxyServer(This,value) (This)->lpVtbl->ProxyNoProxyServer(This,value)
#define IWSManConnectionOptionsEx2_ProxyAuthenticationUseNegotiate(This,value) (This)->lpVtbl->ProxyAuthenticationUseNegotiate(This,value)
#define IWSManConnectionOptionsEx2_ProxyAuthenticationUseBasic(This,value) (This)->lpVtbl->ProxyAuthenticationUseBasic(This,value)
#define IWSManConnectionOptionsEx2_ProxyAuthenticationUseDigest(This,value) (This)->lpVtbl->ProxyAuthenticationUseDigest(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_QueryInterface(IWSManConnectionOptionsEx2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManConnectionOptionsEx2_AddRef(IWSManConnectionOptionsEx2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManConnectionOptionsEx2_Release(IWSManConnectionOptionsEx2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_GetTypeInfoCount(IWSManConnectionOptionsEx2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_GetTypeInfo(IWSManConnectionOptionsEx2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_GetIDsOfNames(IWSManConnectionOptionsEx2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_Invoke(IWSManConnectionOptionsEx2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSManConnectionOptions methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_get_UserName(IWSManConnectionOptionsEx2* This,BSTR *name) {
    return This->lpVtbl->get_UserName(This,name);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_put_UserName(IWSManConnectionOptionsEx2* This,BSTR name) {
    return This->lpVtbl->put_UserName(This,name);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_put_Password(IWSManConnectionOptionsEx2* This,BSTR password) {
    return This->lpVtbl->put_Password(This,password);
}
/*** IWSManConnectionOptionsEx methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_get_CertificateThumbprint(IWSManConnectionOptionsEx2* This,BSTR *thumbprint) {
    return This->lpVtbl->get_CertificateThumbprint(This,thumbprint);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_put_CertificateThumbprint(IWSManConnectionOptionsEx2* This,BSTR thumbprint) {
    return This->lpVtbl->put_CertificateThumbprint(This,thumbprint);
}
/*** IWSManConnectionOptionsEx2 methods ***/
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_SetProxy(IWSManConnectionOptionsEx2* This,LONG accessType,LONG authenticationMechanism,BSTR userName,BSTR password) {
    return This->lpVtbl->SetProxy(This,accessType,authenticationMechanism,userName,password);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyIEConfig(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyIEConfig(This,value);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyWinHttpConfig(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyWinHttpConfig(This,value);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyAutoDetect(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyAutoDetect(This,value);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyNoProxyServer(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyNoProxyServer(This,value);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyAuthenticationUseNegotiate(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyAuthenticationUseNegotiate(This,value);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyAuthenticationUseBasic(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyAuthenticationUseBasic(This,value);
}
static FORCEINLINE HRESULT IWSManConnectionOptionsEx2_ProxyAuthenticationUseDigest(IWSManConnectionOptionsEx2* This,LONG *value) {
    return This->lpVtbl->ProxyAuthenticationUseDigest(This,value);
}
#endif
#endif

#endif


#endif  /* __IWSManConnectionOptionsEx2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManSession interface
 */
#ifndef __IWSManSession_INTERFACE_DEFINED__
#define __IWSManSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManSession, 0xfc84dc58, 0x1286, 0x40c4, 0x9d,0xa0, 0xc8,0xef,0x6e,0xc2,0x41,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fc84dc58-1286-40c4-9da0-c8ef6ec241e0")
IWSManSession : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Get(
        VARIANT resourceUri,
        LONG flags,
        BSTR *resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Put(
        VARIANT resourceUri,
        BSTR resource,
        LONG flags,
        BSTR *resultResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Create(
        VARIANT resourceUri,
        BSTR resource,
        LONG flags,
        BSTR *newUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        VARIANT resourceUri,
        LONG flags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        BSTR actionUri,
        VARIANT resourceUri,
        BSTR parameters,
        LONG flags,
        BSTR *result) = 0;

    virtual HRESULT STDMETHODCALLTYPE Enumerate(
        VARIANT resourceUri,
        BSTR filter,
        BSTR dialect,
        LONG flags,
        IDispatch **resultSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE Identify(
        LONG flags,
        BSTR *result) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Error(
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BatchItems(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_BatchItems(
        LONG value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Timeout(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Timeout(
        LONG value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManSession, 0xfc84dc58, 0x1286, 0x40c4, 0x9d,0xa0, 0xc8,0xef,0x6e,0xc2,0x41,0xe0)
#endif
#else
typedef struct IWSManSessionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManSession *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManSession *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManSession *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManSession *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManSession *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManSession *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManSession *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManSession methods ***/
    HRESULT (STDMETHODCALLTYPE *Get)(
        IWSManSession *This,
        VARIANT resourceUri,
        LONG flags,
        BSTR *resource);

    HRESULT (STDMETHODCALLTYPE *Put)(
        IWSManSession *This,
        VARIANT resourceUri,
        BSTR resource,
        LONG flags,
        BSTR *resultResource);

    HRESULT (STDMETHODCALLTYPE *Create)(
        IWSManSession *This,
        VARIANT resourceUri,
        BSTR resource,
        LONG flags,
        BSTR *newUri);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IWSManSession *This,
        VARIANT resourceUri,
        LONG flags);

    HRESULT (STDMETHODCALLTYPE *IWSManSession_Invoke)(
        IWSManSession *This,
        BSTR actionUri,
        VARIANT resourceUri,
        BSTR parameters,
        LONG flags,
        BSTR *result);

    HRESULT (STDMETHODCALLTYPE *Enumerate)(
        IWSManSession *This,
        VARIANT resourceUri,
        BSTR filter,
        BSTR dialect,
        LONG flags,
        IDispatch **resultSet);

    HRESULT (STDMETHODCALLTYPE *Identify)(
        IWSManSession *This,
        LONG flags,
        BSTR *result);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSManSession *This,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *get_BatchItems)(
        IWSManSession *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *put_BatchItems)(
        IWSManSession *This,
        LONG value);

    HRESULT (STDMETHODCALLTYPE *get_Timeout)(
        IWSManSession *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *put_Timeout)(
        IWSManSession *This,
        LONG value);

    END_INTERFACE
} IWSManSessionVtbl;

interface IWSManSession {
    CONST_VTBL IWSManSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManSession_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManSession_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManSession_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManSession_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
/*** IWSManSession methods ***/
#define IWSManSession_Get(This,resourceUri,flags,resource) (This)->lpVtbl->Get(This,resourceUri,flags,resource)
#define IWSManSession_Put(This,resourceUri,resource,flags,resultResource) (This)->lpVtbl->Put(This,resourceUri,resource,flags,resultResource)
#define IWSManSession_Create(This,resourceUri,resource,flags,newUri) (This)->lpVtbl->Create(This,resourceUri,resource,flags,newUri)
#define IWSManSession_Delete(This,resourceUri,flags) (This)->lpVtbl->Delete(This,resourceUri,flags)
#define IWSManSession_Invoke(This,actionUri,resourceUri,parameters,flags,result) (This)->lpVtbl->IWSManSession_Invoke(This,actionUri,resourceUri,parameters,flags,result)
#define IWSManSession_Enumerate(This,resourceUri,filter,dialect,flags,resultSet) (This)->lpVtbl->Enumerate(This,resourceUri,filter,dialect,flags,resultSet)
#define IWSManSession_Identify(This,flags,result) (This)->lpVtbl->Identify(This,flags,result)
#define IWSManSession_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
#define IWSManSession_get_BatchItems(This,value) (This)->lpVtbl->get_BatchItems(This,value)
#define IWSManSession_put_BatchItems(This,value) (This)->lpVtbl->put_BatchItems(This,value)
#define IWSManSession_get_Timeout(This,value) (This)->lpVtbl->get_Timeout(This,value)
#define IWSManSession_put_Timeout(This,value) (This)->lpVtbl->put_Timeout(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManSession_QueryInterface(IWSManSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManSession_AddRef(IWSManSession* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManSession_Release(IWSManSession* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManSession_GetTypeInfoCount(IWSManSession* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManSession_GetTypeInfo(IWSManSession* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManSession_GetIDsOfNames(IWSManSession* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
/*** IWSManSession methods ***/
static FORCEINLINE HRESULT IWSManSession_Get(IWSManSession* This,VARIANT resourceUri,LONG flags,BSTR *resource) {
    return This->lpVtbl->Get(This,resourceUri,flags,resource);
}
static FORCEINLINE HRESULT IWSManSession_Put(IWSManSession* This,VARIANT resourceUri,BSTR resource,LONG flags,BSTR *resultResource) {
    return This->lpVtbl->Put(This,resourceUri,resource,flags,resultResource);
}
static FORCEINLINE HRESULT IWSManSession_Create(IWSManSession* This,VARIANT resourceUri,BSTR resource,LONG flags,BSTR *newUri) {
    return This->lpVtbl->Create(This,resourceUri,resource,flags,newUri);
}
static FORCEINLINE HRESULT IWSManSession_Delete(IWSManSession* This,VARIANT resourceUri,LONG flags) {
    return This->lpVtbl->Delete(This,resourceUri,flags);
}
static FORCEINLINE HRESULT IWSManSession_Invoke(IWSManSession* This,BSTR actionUri,VARIANT resourceUri,BSTR parameters,LONG flags,BSTR *result) {
    return This->lpVtbl->IWSManSession_Invoke(This,actionUri,resourceUri,parameters,flags,result);
}
static FORCEINLINE HRESULT IWSManSession_Enumerate(IWSManSession* This,VARIANT resourceUri,BSTR filter,BSTR dialect,LONG flags,IDispatch **resultSet) {
    return This->lpVtbl->Enumerate(This,resourceUri,filter,dialect,flags,resultSet);
}
static FORCEINLINE HRESULT IWSManSession_Identify(IWSManSession* This,LONG flags,BSTR *result) {
    return This->lpVtbl->Identify(This,flags,result);
}
static FORCEINLINE HRESULT IWSManSession_get_Error(IWSManSession* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
static FORCEINLINE HRESULT IWSManSession_get_BatchItems(IWSManSession* This,LONG *value) {
    return This->lpVtbl->get_BatchItems(This,value);
}
static FORCEINLINE HRESULT IWSManSession_put_BatchItems(IWSManSession* This,LONG value) {
    return This->lpVtbl->put_BatchItems(This,value);
}
static FORCEINLINE HRESULT IWSManSession_get_Timeout(IWSManSession* This,LONG *value) {
    return This->lpVtbl->get_Timeout(This,value);
}
static FORCEINLINE HRESULT IWSManSession_put_Timeout(IWSManSession* This,LONG value) {
    return This->lpVtbl->put_Timeout(This,value);
}
#endif
#endif

#endif


#endif  /* __IWSManSession_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManEnumerator interface
 */
#ifndef __IWSManEnumerator_INTERFACE_DEFINED__
#define __IWSManEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManEnumerator, 0xf3457ca9, 0xabb9, 0x4fa5, 0xb8,0x50, 0x90,0xe8,0xca,0x30,0x0e,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f3457ca9-abb9-4fa5-b850-90e8ca300e7f")
IWSManEnumerator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE ReadItem(
        BSTR *resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AtEndOfStream(
        VARIANT_BOOL *eos) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Error(
        BSTR *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManEnumerator, 0xf3457ca9, 0xabb9, 0x4fa5, 0xb8,0x50, 0x90,0xe8,0xca,0x30,0x0e,0x7f)
#endif
#else
typedef struct IWSManEnumeratorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManEnumerator *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManEnumerator *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManEnumerator *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManEnumerator *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManEnumerator *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManEnumerator *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManEnumerator *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *ReadItem)(
        IWSManEnumerator *This,
        BSTR *resource);

    HRESULT (STDMETHODCALLTYPE *get_AtEndOfStream)(
        IWSManEnumerator *This,
        VARIANT_BOOL *eos);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSManEnumerator *This,
        BSTR *value);

    END_INTERFACE
} IWSManEnumeratorVtbl;

interface IWSManEnumerator {
    CONST_VTBL IWSManEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManEnumerator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManEnumerator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManEnumerator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManEnumerator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSManEnumerator methods ***/
#define IWSManEnumerator_ReadItem(This,resource) (This)->lpVtbl->ReadItem(This,resource)
#define IWSManEnumerator_get_AtEndOfStream(This,eos) (This)->lpVtbl->get_AtEndOfStream(This,eos)
#define IWSManEnumerator_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManEnumerator_QueryInterface(IWSManEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManEnumerator_AddRef(IWSManEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManEnumerator_Release(IWSManEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManEnumerator_GetTypeInfoCount(IWSManEnumerator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManEnumerator_GetTypeInfo(IWSManEnumerator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManEnumerator_GetIDsOfNames(IWSManEnumerator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManEnumerator_Invoke(IWSManEnumerator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSManEnumerator methods ***/
static FORCEINLINE HRESULT IWSManEnumerator_ReadItem(IWSManEnumerator* This,BSTR *resource) {
    return This->lpVtbl->ReadItem(This,resource);
}
static FORCEINLINE HRESULT IWSManEnumerator_get_AtEndOfStream(IWSManEnumerator* This,VARIANT_BOOL *eos) {
    return This->lpVtbl->get_AtEndOfStream(This,eos);
}
static FORCEINLINE HRESULT IWSManEnumerator_get_Error(IWSManEnumerator* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
#endif
#endif

#endif


#endif  /* __IWSManEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManResourceLocator interface
 */
#ifndef __IWSManResourceLocator_INTERFACE_DEFINED__
#define __IWSManResourceLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManResourceLocator, 0xa7a1ba28, 0xde41, 0x466a, 0xad,0x0a, 0xc4,0x05,0x9e,0xad,0x74,0x28);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a7a1ba28-de41-466a-ad0a-c4059ead7428")
IWSManResourceLocator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_ResourceURI(
        BSTR uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResourceURI(
        BSTR *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSelector(
        BSTR resourceSelName,
        VARIANT selValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearSelectors(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FragmentPath(
        BSTR *text) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FragmentPath(
        BSTR text) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FragmentDialect(
        BSTR *text) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FragmentDialect(
        BSTR text) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddOption(
        BSTR OptionName,
        VARIANT OptionValue,
        WINBOOL mustComply = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MustUnderstandOptions(
        WINBOOL mustUnderstand) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MustUnderstandOptions(
        WINBOOL *mustUnderstand) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearOptions(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Error(
        BSTR *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManResourceLocator, 0xa7a1ba28, 0xde41, 0x466a, 0xad,0x0a, 0xc4,0x05,0x9e,0xad,0x74,0x28)
#endif
#else
typedef struct IWSManResourceLocatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManResourceLocator *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManResourceLocator *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManResourceLocator *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManResourceLocator *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManResourceLocator *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManResourceLocator *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManResourceLocator *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManResourceLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ResourceURI)(
        IWSManResourceLocator *This,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *get_ResourceURI)(
        IWSManResourceLocator *This,
        BSTR *uri);

    HRESULT (STDMETHODCALLTYPE *AddSelector)(
        IWSManResourceLocator *This,
        BSTR resourceSelName,
        VARIANT selValue);

    HRESULT (STDMETHODCALLTYPE *ClearSelectors)(
        IWSManResourceLocator *This);

    HRESULT (STDMETHODCALLTYPE *get_FragmentPath)(
        IWSManResourceLocator *This,
        BSTR *text);

    HRESULT (STDMETHODCALLTYPE *put_FragmentPath)(
        IWSManResourceLocator *This,
        BSTR text);

    HRESULT (STDMETHODCALLTYPE *get_FragmentDialect)(
        IWSManResourceLocator *This,
        BSTR *text);

    HRESULT (STDMETHODCALLTYPE *put_FragmentDialect)(
        IWSManResourceLocator *This,
        BSTR text);

    HRESULT (STDMETHODCALLTYPE *AddOption)(
        IWSManResourceLocator *This,
        BSTR OptionName,
        VARIANT OptionValue,
        WINBOOL mustComply);

    HRESULT (STDMETHODCALLTYPE *put_MustUnderstandOptions)(
        IWSManResourceLocator *This,
        WINBOOL mustUnderstand);

    HRESULT (STDMETHODCALLTYPE *get_MustUnderstandOptions)(
        IWSManResourceLocator *This,
        WINBOOL *mustUnderstand);

    HRESULT (STDMETHODCALLTYPE *ClearOptions)(
        IWSManResourceLocator *This);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWSManResourceLocator *This,
        BSTR *value);

    END_INTERFACE
} IWSManResourceLocatorVtbl;

interface IWSManResourceLocator {
    CONST_VTBL IWSManResourceLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManResourceLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManResourceLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManResourceLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManResourceLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManResourceLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManResourceLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManResourceLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSManResourceLocator methods ***/
#define IWSManResourceLocator_put_ResourceURI(This,uri) (This)->lpVtbl->put_ResourceURI(This,uri)
#define IWSManResourceLocator_get_ResourceURI(This,uri) (This)->lpVtbl->get_ResourceURI(This,uri)
#define IWSManResourceLocator_AddSelector(This,resourceSelName,selValue) (This)->lpVtbl->AddSelector(This,resourceSelName,selValue)
#define IWSManResourceLocator_ClearSelectors(This) (This)->lpVtbl->ClearSelectors(This)
#define IWSManResourceLocator_get_FragmentPath(This,text) (This)->lpVtbl->get_FragmentPath(This,text)
#define IWSManResourceLocator_put_FragmentPath(This,text) (This)->lpVtbl->put_FragmentPath(This,text)
#define IWSManResourceLocator_get_FragmentDialect(This,text) (This)->lpVtbl->get_FragmentDialect(This,text)
#define IWSManResourceLocator_put_FragmentDialect(This,text) (This)->lpVtbl->put_FragmentDialect(This,text)
#define IWSManResourceLocator_AddOption(This,OptionName,OptionValue,mustComply) (This)->lpVtbl->AddOption(This,OptionName,OptionValue,mustComply)
#define IWSManResourceLocator_put_MustUnderstandOptions(This,mustUnderstand) (This)->lpVtbl->put_MustUnderstandOptions(This,mustUnderstand)
#define IWSManResourceLocator_get_MustUnderstandOptions(This,mustUnderstand) (This)->lpVtbl->get_MustUnderstandOptions(This,mustUnderstand)
#define IWSManResourceLocator_ClearOptions(This) (This)->lpVtbl->ClearOptions(This)
#define IWSManResourceLocator_get_Error(This,value) (This)->lpVtbl->get_Error(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManResourceLocator_QueryInterface(IWSManResourceLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManResourceLocator_AddRef(IWSManResourceLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManResourceLocator_Release(IWSManResourceLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManResourceLocator_GetTypeInfoCount(IWSManResourceLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManResourceLocator_GetTypeInfo(IWSManResourceLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManResourceLocator_GetIDsOfNames(IWSManResourceLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManResourceLocator_Invoke(IWSManResourceLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSManResourceLocator methods ***/
static FORCEINLINE HRESULT IWSManResourceLocator_put_ResourceURI(IWSManResourceLocator* This,BSTR uri) {
    return This->lpVtbl->put_ResourceURI(This,uri);
}
static FORCEINLINE HRESULT IWSManResourceLocator_get_ResourceURI(IWSManResourceLocator* This,BSTR *uri) {
    return This->lpVtbl->get_ResourceURI(This,uri);
}
static FORCEINLINE HRESULT IWSManResourceLocator_AddSelector(IWSManResourceLocator* This,BSTR resourceSelName,VARIANT selValue) {
    return This->lpVtbl->AddSelector(This,resourceSelName,selValue);
}
static FORCEINLINE HRESULT IWSManResourceLocator_ClearSelectors(IWSManResourceLocator* This) {
    return This->lpVtbl->ClearSelectors(This);
}
static FORCEINLINE HRESULT IWSManResourceLocator_get_FragmentPath(IWSManResourceLocator* This,BSTR *text) {
    return This->lpVtbl->get_FragmentPath(This,text);
}
static FORCEINLINE HRESULT IWSManResourceLocator_put_FragmentPath(IWSManResourceLocator* This,BSTR text) {
    return This->lpVtbl->put_FragmentPath(This,text);
}
static FORCEINLINE HRESULT IWSManResourceLocator_get_FragmentDialect(IWSManResourceLocator* This,BSTR *text) {
    return This->lpVtbl->get_FragmentDialect(This,text);
}
static FORCEINLINE HRESULT IWSManResourceLocator_put_FragmentDialect(IWSManResourceLocator* This,BSTR text) {
    return This->lpVtbl->put_FragmentDialect(This,text);
}
static FORCEINLINE HRESULT IWSManResourceLocator_AddOption(IWSManResourceLocator* This,BSTR OptionName,VARIANT OptionValue,WINBOOL mustComply) {
    return This->lpVtbl->AddOption(This,OptionName,OptionValue,mustComply);
}
static FORCEINLINE HRESULT IWSManResourceLocator_put_MustUnderstandOptions(IWSManResourceLocator* This,WINBOOL mustUnderstand) {
    return This->lpVtbl->put_MustUnderstandOptions(This,mustUnderstand);
}
static FORCEINLINE HRESULT IWSManResourceLocator_get_MustUnderstandOptions(IWSManResourceLocator* This,WINBOOL *mustUnderstand) {
    return This->lpVtbl->get_MustUnderstandOptions(This,mustUnderstand);
}
static FORCEINLINE HRESULT IWSManResourceLocator_ClearOptions(IWSManResourceLocator* This) {
    return This->lpVtbl->ClearOptions(This);
}
static FORCEINLINE HRESULT IWSManResourceLocator_get_Error(IWSManResourceLocator* This,BSTR *value) {
    return This->lpVtbl->get_Error(This,value);
}
#endif
#endif

#endif


#endif  /* __IWSManResourceLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManResourceLocatorInternal interface
 */
#ifndef __IWSManResourceLocatorInternal_INTERFACE_DEFINED__
#define __IWSManResourceLocatorInternal_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManResourceLocatorInternal, 0xeffaead7, 0x7ec8, 0x4716, 0xb9,0xbe, 0xf2,0xe7,0xe9,0xfb,0x4a,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("effaead7-7ec8-4716-b9be-f2e7e9fb4adb")
IWSManResourceLocatorInternal : public IUnknown
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManResourceLocatorInternal, 0xeffaead7, 0x7ec8, 0x4716, 0xb9,0xbe, 0xf2,0xe7,0xe9,0xfb,0x4a,0xdb)
#endif
#else
typedef struct IWSManResourceLocatorInternalVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManResourceLocatorInternal *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManResourceLocatorInternal *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManResourceLocatorInternal *This);

    END_INTERFACE
} IWSManResourceLocatorInternalVtbl;

interface IWSManResourceLocatorInternal {
    CONST_VTBL IWSManResourceLocatorInternalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManResourceLocatorInternal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManResourceLocatorInternal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManResourceLocatorInternal_Release(This) (This)->lpVtbl->Release(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManResourceLocatorInternal_QueryInterface(IWSManResourceLocatorInternal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManResourceLocatorInternal_AddRef(IWSManResourceLocatorInternal* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManResourceLocatorInternal_Release(IWSManResourceLocatorInternal* This) {
    return This->lpVtbl->Release(This);
}
#endif
#endif

#endif


#endif  /* __IWSManResourceLocatorInternal_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSManInternal interface
 */
#ifndef __IWSManInternal_INTERFACE_DEFINED__
#define __IWSManInternal_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSManInternal, 0x04ae2b1d, 0x9954, 0x4d99, 0x94,0xa9, 0xa9,0x61,0xe7,0x2c,0x3a,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("04ae2b1d-9954-4d99-94a9-a961e72c3a13")
IWSManInternal : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE ConfigSDDL(
        IDispatch *session,
        VARIANT resourceUri,
        LONG flags,
        BSTR *resource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSManInternal, 0x04ae2b1d, 0x9954, 0x4d99, 0x94,0xa9, 0xa9,0x61,0xe7,0x2c,0x3a,0x13)
#endif
#else
typedef struct IWSManInternalVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWSManInternal *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWSManInternal *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWSManInternal *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSManInternal *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSManInternal *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSManInternal *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSManInternal *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSManInternal methods ***/
    HRESULT (STDMETHODCALLTYPE *ConfigSDDL)(
        IWSManInternal *This,
        IDispatch *session,
        VARIANT resourceUri,
        LONG flags,
        BSTR *resource);

    END_INTERFACE
} IWSManInternalVtbl;

interface IWSManInternal {
    CONST_VTBL IWSManInternalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSManInternal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSManInternal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSManInternal_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSManInternal_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSManInternal_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSManInternal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSManInternal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSManInternal methods ***/
#define IWSManInternal_ConfigSDDL(This,session,resourceUri,flags,resource) (This)->lpVtbl->ConfigSDDL(This,session,resourceUri,flags,resource)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWSManInternal_QueryInterface(IWSManInternal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWSManInternal_AddRef(IWSManInternal* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWSManInternal_Release(IWSManInternal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWSManInternal_GetTypeInfoCount(IWSManInternal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWSManInternal_GetTypeInfo(IWSManInternal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWSManInternal_GetIDsOfNames(IWSManInternal* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWSManInternal_Invoke(IWSManInternal* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSManInternal methods ***/
static FORCEINLINE HRESULT IWSManInternal_ConfigSDDL(IWSManInternal* This,IDispatch *session,VARIANT resourceUri,LONG flags,BSTR *resource) {
    return This->lpVtbl->ConfigSDDL(This,session,resourceUri,flags,resource);
}
#endif
#endif

#endif


#endif  /* __IWSManInternal_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wsmandisp_h__ */
