Search the GP Tables
Search by TABLE NAME
Search by FIELD NAME
These are our SOP scripts. All of our scripts for Dynamics GP can be found here
DynDeveloper.com

DynDeveloper.com

Table Edits Forum Articles
Table Edits 0 Table Edits 0 Table Edits 0
Sign Up Now!Log In
pdupont@enerkem.com 8/2/2017 10:49:58 AM

eConnect (impersonation of a user)

Hi!

I have a small problem retreiving a Sales_Transaction in Dynamics GP. If I use the current user (my user, without impersonation) it is working. But if I do an impersonation with my user, it is not working...

Want to know if someone could help me with this!

Have a nice day!!

-Patrick.


Here is my C# code below, and after I put the impersonate class :


***********************************************************************************************************************************
public taSopHdrIvcInsert GetSalesTransaction(string transactionNumber)
{
taSopHdrIvcInsert returnValue = null;
eConnectMethods eConnectObject;
eConnectOut myRequest;
RQeConnectOutType[] eConnectOutType;
eConnectType eConnectDoc;
System.IO.MemoryStream memStream;
System.Xml.Serialization.XmlSerializer serializer;
System.Xml.XmlDocument myDoc;
string salesOrderEntityString;
System.IO.StringReader requestReader;
System.Xml.XmlTextReader xmlTextReader;
string salesorderXml;
System.IO.StringReader salesorderReader;
System.Xml.Serialization.XmlSerializer deSerializer;

try
{
using (Impersonator imp = new Impersonator("MyUserName", "MyDomain", "MyPassword"))
{
//set the requester to retreive a sales order
myRequest = new eConnectOut();
myRequest.DOCTYPE = "Sales_Transaction";
myRequest.OUTPUTTYPE = 1;
myRequest.INDEX1FROM = transactionNumber;
myRequest.INDEX1TO = transactionNumber;
myRequest.FORLIST = 1;
//myRequest.WhereClause = "CUSTNMBR = '" + customerNumber + "'";

//create the eConnect requester XML document object
eConnectOutType = new RQeConnectOutType[1] { new RQeConnectOutType() };
eConnectOutType[0].eConnectOut = myRequest;
eConnectDoc = new eConnectType();
eConnectDoc.RQeConnectOutType = eConnectOutType;

//serialize the object to produce an XML document
memStream = new System.IO.MemoryStream();
serializer = new System.Xml.Serialization.XmlSerializer(typeof(eConnectType));
serializer.Serialize(memStream, eConnectDoc);
memStream.Position = 0;
myDoc = new System.Xml.XmlDocument();
myDoc.Load(memStream);

//get the sales order entity
eConnectObject = new eConnectMethods();
salesOrderEntityString = eConnectObject.GetEntity(_connectionString, myDoc.OuterXml);

//load the xml document string into a StringReader
requestReader = new System.IO.StringReader(salesOrderEntityString);

//use the StringReader to populate an XML text reader
xmlTextReader = new System.Xml.XmlTextReader(requestReader);

//use the XML text reader to find the sales order XML in the eConnect Requester response document
//the eConnect_Out_Setup table shows that the sales order XML data will be enclosed in <SO_Trans> tags
xmlTextReader.ReadToFollowing("SO_Trans");
salesorderXml = xmlTextReader.ReadInnerXml();
salesorderXml = string.Concat("<?xml version=\"1.0\"?><taSopHdrIvcInsert>", salesorderXml, "</taSopHdrIvcInsert>");
salesorderReader = new System.IO.StringReader(salesorderXml);

//deserialize the XML node from the StringReader
deSerializer = new System.Xml.Serialization.XmlSerializer(typeof(taSopHdrIvcInsert));

//cast the deserialized object to a taSopHdrIvcInsert serialization object
returnValue = (taSopHdrIvcInsert)deSerializer.Deserialize(salesorderReader);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error:eConnectEnerkemGP.GetSalesTransaction()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

return returnValue;
}

***********************************************************************************************************************************
namespace MyNameSpace
{
    #region Using directives.
    // ----------------------------------------------------------------------

    using System;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    using System.ComponentModel;

    // ----------------------------------------------------------------------
    #endregion

    /////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// Impersonation of a user. Allows to execute code under another
    /// user context.
    /// Please note that the account that instantiates the Impersonator class
    /// needs to have the 'Act as part of operating system' privilege set.
    /// </summary>
    /// <remarks>
    /// This class is based on the information in the Microsoft knowledge base
    /// article http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158
    /// 
    /// Encapsulate an instance into a using-directive like e.g.:
    /// 
    /// ...
    /// using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
    /// {
    /// ...
    /// [code that executes under the new context]
    /// ...
    /// }
    /// ...
    /// 
    /// Please contact the author Uwe Keim (mailto:uwe.keim@zeta-software.de)
    /// for questions regarding this class.
    /// </remarks>
    public class Impersonator :
        IDisposable
    {
        #region Public methods.
        // ------------------------------------------------------------------

        /// <summary>
        /// Constructor. Starts the impersonation with the given credentials.
        /// Please note that the account that instantiates the Impersonator class
        /// needs to have the 'Act as part of operating system' privilege set.
        /// </summary>
        /// <param name="userName">The name of the user to act as.</param>
        /// <param name="domainName">The domain name of the user to act as.</param>
        /// <param name="password">The password of the user to act as.</param>
        public Impersonator(
            string userName,
            string domainName,
            string password)
        {
            ImpersonateValidUser(userName, domainName, password);
        }

        // ------------------------------------------------------------------
        #endregion

        #region IDisposable member.
        // ------------------------------------------------------------------

        public void Dispose()
        {
            UndoImpersonation();
        }

        // ------------------------------------------------------------------
        #endregion

        #region P/Invoke.
        // ------------------------------------------------------------------

        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern int LogonUser(
            string lpszUserName,
            string lpszDomain,
            string lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int DuplicateToken(
            IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern bool CloseHandle(
            IntPtr handle);

        private const int LOGON32_LOGON_INTERACTIVE = 2;
        private const int LOGON32_PROVIDER_DEFAULT = 0;

        // ------------------------------------------------------------------
        #endregion

        #region Private member.
        // ------------------------------------------------------------------

        /// <summary>
        /// Does the actual impersonation.
        /// </summary>
        /// <param name="userName">The name of the user to act as.</param>
        /// <param name="domainName">The domain name of the user to act as.</param>
        /// <param name="password">The password of the user to act as.</param>
        private void ImpersonateValidUser(
            string userName,
            string domain,
            string password)
        {
            WindowsIdentity tempWindowsIdentity = null;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            try
            {
                if (RevertToSelf())
                {
                    if (LogonUser(
                        userName,
                        domain,
                        password,
                        LOGON32_LOGON_INTERACTIVE,
                        LOGON32_PROVIDER_DEFAULT,
                        ref token) != 0)
                    {
                        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                        {
                            tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                            impersonationContext = tempWindowsIdentity.Impersonate();
                        }
                        else
                        {
                            throw new Win32Exception(Marshal.GetLastWin32Error());
                        }
                    }
                    else
                    {
                        throw new Win32Exception(Marshal.GetLastWin32Error());
                    }
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
            finally
            {
                if (token != IntPtr.Zero)
                {
                    CloseHandle(token);
                }
                if (tokenDuplicate != IntPtr.Zero)
                {
                    CloseHandle(tokenDuplicate);
                }
            }
        }

        /// <summary>
        /// Reverts the impersonation.
        /// </summary>
        private void UndoImpersonation()
        {
            if (impersonationContext != null)
            {
                impersonationContext.Undo();
            }
        }

        private WindowsImpersonationContext impersonationContext = null;

        // ------------------------------------------------------------------
        #endregion
    }

    /////////////////////////////////////////////////////////////////////////
}
Version: GP 2015
Section: .NET Development, Dynamics GP, eConnect








Table Definition Quick Links
All Tables
SOP Tables
RM Tables
GL Tables
POP Tables
HR Tables
PM Tables
UPR Tables
IV Tables
Olympic Tables