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

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#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;
#endif

#ifndef __IWSManEx_FWD_DEFINED__
#define __IWSManEx_FWD_DEFINED__
typedef interface IWSManEx IWSManEx;
#endif

#ifndef __IWSManEx2_FWD_DEFINED__
#define __IWSManEx2_FWD_DEFINED__
typedef interface IWSManEx2 IWSManEx2;
#endif

#ifndef __IWSManEx3_FWD_DEFINED__
#define __IWSManEx3_FWD_DEFINED__
typedef interface IWSManEx3 IWSManEx3;
#endif

#ifndef __IWSManConnectionOptions_FWD_DEFINED__
#define __IWSManConnectionOptions_FWD_DEFINED__
typedef interface IWSManConnectionOptions IWSManConnectionOptions;
#endif

#ifndef __IWSManConnectionOptionsEx_FWD_DEFINED__
#define __IWSManConnectionOptionsEx_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx IWSManConnectionOptionsEx;
#endif

#ifndef __IWSManConnectionOptionsEx2_FWD_DEFINED__
#define __IWSManConnectionOptionsEx2_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx2 IWSManConnectionOptionsEx2;
#endif

#ifndef __IWSManSession_FWD_DEFINED__
#define __IWSManSession_FWD_DEFINED__
typedef interface IWSManSession IWSManSession;
#endif

#ifndef __IWSManEnumerator_FWD_DEFINED__
#define __IWSManEnumerator_FWD_DEFINED__
typedef interface IWSManEnumerator IWSManEnumerator;
#endif

#ifndef __IWSManResourceLocator_FWD_DEFINED__
#define __IWSManResourceLocator_FWD_DEFINED__
typedef interface IWSManResourceLocator IWSManResourceLocator;
#endif

#ifndef __IWSManResourceLocatorInternal_FWD_DEFINED__
#define __IWSManResourceLocatorInternal_FWD_DEFINED__
typedef interface IWSManResourceLocatorInternal IWSManResourceLocatorInternal;
#endif

#ifndef __IWSManInternal_FWD_DEFINED__
#define __IWSManInternal_FWD_DEFINED__
typedef interface IWSManInternal IWSManInternal;
#endif

/* Headers for imported files */

#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

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;
#endif

#ifndef __IWSManEx_FWD_DEFINED__
#define __IWSManEx_FWD_DEFINED__
typedef interface IWSManEx IWSManEx;
#endif

#ifndef __IWSManEx2_FWD_DEFINED__
#define __IWSManEx2_FWD_DEFINED__
typedef interface IWSManEx2 IWSManEx2;
#endif

#ifndef __IWSManEx3_FWD_DEFINED__
#define __IWSManEx3_FWD_DEFINED__
typedef interface IWSManEx3 IWSManEx3;
#endif

#ifndef __IWSManConnectionOptions_FWD_DEFINED__
#define __IWSManConnectionOptions_FWD_DEFINED__
typedef interface IWSManConnectionOptions IWSManConnectionOptions;
#endif

#ifndef __IWSManConnectionOptionsEx_FWD_DEFINED__
#define __IWSManConnectionOptionsEx_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx IWSManConnectionOptionsEx;
#endif

#ifndef __IWSManConnectionOptionsEx2_FWD_DEFINED__
#define __IWSManConnectionOptionsEx2_FWD_DEFINED__
typedef interface IWSManConnectionOptionsEx2 IWSManConnectionOptionsEx2;
#endif

#ifndef __IWSManSession_FWD_DEFINED__
#define __IWSManSession_FWD_DEFINED__
typedef interface IWSManSession IWSManSession;
#endif

#ifndef __IWSManSessionEx_FWD_DEFINED__
#define __IWSManSessionEx_FWD_DEFINED__
typedef interface IWSManSessionEx IWSManSessionEx;
#endif

#ifndef __IWSManEnumerator_FWD_DEFINED__
#define __IWSManEnumerator_FWD_DEFINED__
typedef interface IWSManEnumerator IWSManEnumerator;
#endif

#ifndef __IWSManResourceLocator_FWD_DEFINED__
#define __IWSManResourceLocator_FWD_DEFINED__
typedef interface IWSManResourceLocator IWSManResourceLocator;
#endif

#ifndef __IWSManResourceLocatorInternal_FWD_DEFINED__
#define __IWSManResourceLocatorInternal_FWD_DEFINED__
typedef interface IWSManResourceLocatorInternal IWSManResourceLocatorInternal;
#endif

#ifndef __IWSManInternal_FWD_DEFINED__
#define __IWSManInternal_FWD_DEFINED__
typedef interface IWSManInternal IWSManInternal;
#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

/*****************************************************************************
 * 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

HRESULT STDMETHODCALLTYPE IWSMan_CreateSession_Proxy(
    IWSMan* This,
    BSTR connection,
    LONG flags,
    IDispatch *connectionOptions,
    IDispatch **session);
void __RPC_STUB IWSMan_CreateSession_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSMan_CreateConnectionOptions_Proxy(
    IWSMan* This,
    IDispatch **connectionOptions);
void __RPC_STUB IWSMan_CreateConnectionOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSMan_get_CommandLine_Proxy(
    IWSMan* This,
    BSTR *value);
void __RPC_STUB IWSMan_get_CommandLine_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSMan_get_Error_Proxy(
    IWSMan* This,
    BSTR *value);
void __RPC_STUB IWSMan_get_Error_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManEx_CreateResourceLocator_Proxy(
    IWSManEx* This,
    BSTR strResourceLocator,
    IDispatch **newResourceLocator);
void __RPC_STUB IWSManEx_CreateResourceLocator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagUTF8_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagUTF8_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagCredUsernamePassword_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagCredUsernamePassword_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagSkipCACheck_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagSkipCACheck_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagSkipCNCheck_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagSkipCNCheck_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagUseDigest_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagUseDigest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagUseNegotiate_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagUseNegotiate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagUseBasic_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagUseBasic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagUseKerberos_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagUseKerberos_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagNoEncryption_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagNoEncryption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagEnableSPNServerPort_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagEnableSPNServerPort_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_SessionFlagUseNoAuthentication_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_SessionFlagUseNoAuthentication_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagNonXmlText_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagNonXmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagReturnEPR_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagReturnEPR_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagReturnObjectAndEPR_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagReturnObjectAndEPR_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_GetErrorMessage_Proxy(
    IWSManEx* This,
    DWORD errorNumber,
    BSTR *errorMessage);
void __RPC_STUB IWSManEx_GetErrorMessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagHierarchyDeep_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagHierarchyDeep_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagHierarchyShallow_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagHierarchyShallow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagHierarchyDeepBasePropsOnly_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagHierarchyDeepBasePropsOnly_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx_EnumerationFlagReturnObject_Proxy(
    IWSManEx* This,
    LONG *flags);
void __RPC_STUB IWSManEx_EnumerationFlagReturnObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManEx2_SessionFlagUseClientCertificate_Proxy(
    IWSManEx2* This,
    LONG *flags);
void __RPC_STUB IWSManEx2_SessionFlagUseClientCertificate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManEx3_SessionFlagUTF16_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_SessionFlagUTF16_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx3_SessionFlagUseCredSsp_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_SessionFlagUseCredSsp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx3_EnumerationFlagAssociationInstance_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_EnumerationFlagAssociationInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx3_EnumerationFlagAssociatedInstance_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_EnumerationFlagAssociatedInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx3_SessionFlagSkipRevocationCheck_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_SessionFlagSkipRevocationCheck_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx3_SessionFlagAllowNegotiateImplicitCredentials_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_SessionFlagAllowNegotiateImplicitCredentials_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEx3_SessionFlagUseSsl_Proxy(
    IWSManEx3* This,
    LONG *flags);
void __RPC_STUB IWSManEx3_SessionFlagUseSsl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManConnectionOptions_get_UserName_Proxy(
    IWSManConnectionOptions* This,
    BSTR *name);
void __RPC_STUB IWSManConnectionOptions_get_UserName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptions_put_UserName_Proxy(
    IWSManConnectionOptions* This,
    BSTR name);
void __RPC_STUB IWSManConnectionOptions_put_UserName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptions_put_Password_Proxy(
    IWSManConnectionOptions* This,
    BSTR password);
void __RPC_STUB IWSManConnectionOptions_put_Password_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx_get_CertificateThumbprint_Proxy(
    IWSManConnectionOptionsEx* This,
    BSTR *thumbprint);
void __RPC_STUB IWSManConnectionOptionsEx_get_CertificateThumbprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx_put_CertificateThumbprint_Proxy(
    IWSManConnectionOptionsEx* This,
    BSTR thumbprint);
void __RPC_STUB IWSManConnectionOptionsEx_put_CertificateThumbprint_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_SetProxy_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG accessType,
    LONG authenticationMechanism,
    BSTR userName,
    BSTR password);
void __RPC_STUB IWSManConnectionOptionsEx2_SetProxy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyIEConfig_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyIEConfig_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyWinHttpConfig_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyWinHttpConfig_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyAutoDetect_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyAutoDetect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyNoProxyServer_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyNoProxyServer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyAuthenticationUseNegotiate_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyAuthenticationUseNegotiate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyAuthenticationUseBasic_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyAuthenticationUseBasic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManConnectionOptionsEx2_ProxyAuthenticationUseDigest_Proxy(
    IWSManConnectionOptionsEx2* This,
    LONG *value);
void __RPC_STUB IWSManConnectionOptionsEx2_ProxyAuthenticationUseDigest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
#define IWSManSession_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** 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_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);
}
static FORCEINLINE HRESULT IWSManSession_Invoke(IWSManSession* 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);
}
/*** 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_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

HRESULT STDMETHODCALLTYPE IWSManSession_Get_Proxy(
    IWSManSession* This,
    VARIANT resourceUri,
    LONG flags,
    BSTR *resource);
void __RPC_STUB IWSManSession_Get_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_Put_Proxy(
    IWSManSession* This,
    VARIANT resourceUri,
    BSTR resource,
    LONG flags,
    BSTR *resultResource);
void __RPC_STUB IWSManSession_Put_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_Create_Proxy(
    IWSManSession* This,
    VARIANT resourceUri,
    BSTR resource,
    LONG flags,
    BSTR *newUri);
void __RPC_STUB IWSManSession_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_Delete_Proxy(
    IWSManSession* This,
    VARIANT resourceUri,
    LONG flags);
void __RPC_STUB IWSManSession_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_Invoke_Proxy(
    IWSManSession* This,
    BSTR actionUri,
    VARIANT resourceUri,
    BSTR parameters,
    LONG flags,
    BSTR *result);
void __RPC_STUB IWSManSession_Invoke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_Enumerate_Proxy(
    IWSManSession* This,
    VARIANT resourceUri,
    BSTR filter,
    BSTR dialect,
    LONG flags,
    IDispatch **resultSet);
void __RPC_STUB IWSManSession_Enumerate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_Identify_Proxy(
    IWSManSession* This,
    LONG flags,
    BSTR *result);
void __RPC_STUB IWSManSession_Identify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_get_Error_Proxy(
    IWSManSession* This,
    BSTR *value);
void __RPC_STUB IWSManSession_get_Error_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_get_BatchItems_Proxy(
    IWSManSession* This,
    LONG *value);
void __RPC_STUB IWSManSession_get_BatchItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_put_BatchItems_Proxy(
    IWSManSession* This,
    LONG value);
void __RPC_STUB IWSManSession_put_BatchItems_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_get_Timeout_Proxy(
    IWSManSession* This,
    LONG *value);
void __RPC_STUB IWSManSession_get_Timeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManSession_put_Timeout_Proxy(
    IWSManSession* This,
    LONG value);
void __RPC_STUB IWSManSession_put_Timeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManEnumerator_ReadItem_Proxy(
    IWSManEnumerator* This,
    BSTR *resource);
void __RPC_STUB IWSManEnumerator_ReadItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEnumerator_get_AtEndOfStream_Proxy(
    IWSManEnumerator* This,
    VARIANT_BOOL *eos);
void __RPC_STUB IWSManEnumerator_get_AtEndOfStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManEnumerator_get_Error_Proxy(
    IWSManEnumerator* This,
    BSTR *value);
void __RPC_STUB IWSManEnumerator_get_Error_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManResourceLocator_put_ResourceURI_Proxy(
    IWSManResourceLocator* This,
    BSTR uri);
void __RPC_STUB IWSManResourceLocator_put_ResourceURI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_get_ResourceURI_Proxy(
    IWSManResourceLocator* This,
    BSTR *uri);
void __RPC_STUB IWSManResourceLocator_get_ResourceURI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_AddSelector_Proxy(
    IWSManResourceLocator* This,
    BSTR resourceSelName,
    VARIANT selValue);
void __RPC_STUB IWSManResourceLocator_AddSelector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_ClearSelectors_Proxy(
    IWSManResourceLocator* This);
void __RPC_STUB IWSManResourceLocator_ClearSelectors_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_get_FragmentPath_Proxy(
    IWSManResourceLocator* This,
    BSTR *text);
void __RPC_STUB IWSManResourceLocator_get_FragmentPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_put_FragmentPath_Proxy(
    IWSManResourceLocator* This,
    BSTR text);
void __RPC_STUB IWSManResourceLocator_put_FragmentPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_get_FragmentDialect_Proxy(
    IWSManResourceLocator* This,
    BSTR *text);
void __RPC_STUB IWSManResourceLocator_get_FragmentDialect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_put_FragmentDialect_Proxy(
    IWSManResourceLocator* This,
    BSTR text);
void __RPC_STUB IWSManResourceLocator_put_FragmentDialect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_AddOption_Proxy(
    IWSManResourceLocator* This,
    BSTR OptionName,
    VARIANT OptionValue,
    WINBOOL mustComply);
void __RPC_STUB IWSManResourceLocator_AddOption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_put_MustUnderstandOptions_Proxy(
    IWSManResourceLocator* This,
    WINBOOL mustUnderstand);
void __RPC_STUB IWSManResourceLocator_put_MustUnderstandOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_get_MustUnderstandOptions_Proxy(
    IWSManResourceLocator* This,
    WINBOOL *mustUnderstand);
void __RPC_STUB IWSManResourceLocator_get_MustUnderstandOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_ClearOptions_Proxy(
    IWSManResourceLocator* This);
void __RPC_STUB IWSManResourceLocator_ClearOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWSManResourceLocator_get_Error_Proxy(
    IWSManResourceLocator* This,
    BSTR *value);
void __RPC_STUB IWSManResourceLocator_get_Error_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IWSManInternal_ConfigSDDL_Proxy(
    IWSManInternal* This,
    IDispatch *session,
    VARIANT resourceUri,
    LONG flags,
    BSTR *resource);
void __RPC_STUB IWSManInternal_ConfigSDDL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWSManInternal_INTERFACE_DEFINED__ */

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wsmandisp_h__ */
