C# Service Status On Remote Machine

后端 未结 1 1369
刺人心
刺人心 2021-01-03 03:05

I\'m an expert programmer, so therefore, I don\'t have a clue as to WTH I\'m doing :)

On a serious note; no, I\'m not expert by any means. I do have a problem though

相关标签:
1条回答
  • 2021-01-03 03:15

    Finally figured it out...

    Created a new class, and is shown below:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    using System.Security.Permissions;
    
    public class ImpersonateUser
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(
        String lpszUsername,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public extern static bool CloseHandle(IntPtr handle);
        private static IntPtr tokenHandle = new IntPtr(0);
        private static WindowsImpersonationContext impersonatedUser;
        // If you incorporate this code into a DLL, be sure to demand that it
        // runs with FullTrust.
        [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
        public void Impersonate(string domainName, string userName, string password)
        {
            //try
            {
                // Use the unmanaged LogonUser function to get the user token for
                // the specified user, domain, and password.
                const int LOGON32_PROVIDER_DEFAULT = 0;
                // Passing this parameter causes LogonUser to create a primary token.
                const int LOGON32_LOGON_INTERACTIVE = 2;
                tokenHandle = IntPtr.Zero;
                // ---- Step - 1
                // Call LogonUser to obtain a handle to an access token.
                bool returnValue = LogonUser(
                userName,
                domainName,
                password,
                LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT,
                ref tokenHandle); // tokenHandle - new security token
                if (false == returnValue)
                {
                    int ret = Marshal.GetLastWin32Error();
                    throw new System.ComponentModel.Win32Exception(ret);
                }
                // ---- Step - 2
                WindowsIdentity newId = new WindowsIdentity(tokenHandle);
                // ---- Step - 3
                {
                    impersonatedUser = newId.Impersonate();
                }
            }
        }
        // Stops impersonation
        public void Undo()
        {
            impersonatedUser.Undo();
            // Free the tokens.
            if (tokenHandle != IntPtr.Zero)
            {
                CloseHandle(tokenHandle);
            }            
        }        
    }    
    

    }

    and the original code that I posted is wrapped by:

    ImpersonateUser iu = new ImpersonateUser();
    iu.Impersonate("[domain]","[username]","[password]");
    // code you want to execute as impersonated user.....
    iu.Undo();
    
    0 讨论(0)
提交回复
热议问题