views:

30

answers:

2

I am having problems getting the code to change the password of a service of windows provided.

Is there an easy way to do this.

i got this link but it seems to be incomplete link text

here they have not declared SC_MANAGER_ALL_ACCESS, m_pServiceHandle

any suggestions?? thanks

+1  A: 

Use WMI in managed code, per this site

using System.Management;

string objPath = string.Format("Win32_Service.Name='{0}'", serviceName);
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath)))
{
   object[] wmiParams = new object[11];
   wmiParams[6] = username;
   wmiParams[7] = password;
   service.InvokeMethod("Change", wmiParams);
}
Steve Townsend
A: 

This works perfect...

    private const int SC_MANAGER_ALL_ACCESS = 0x000F003F;      
    string serviceName;
    private const uint SERVICE_NO_CHANGE = 0xffffffff; //this value is found in winsvc.h
    private const uint SERVICE_QUERY_CONFIG = 0x00000001;
    private const uint SERVICE_CHANGE_CONFIG = 0x00000002;
    private const uint SERVICE_QUERY_STATUS = 0x00000004;
    private const uint SERVICE_ENUMERATE_DEPENDENTS = 0x00000008;
    private const uint SERVICE_START = 0x00000010;
    private const uint SERVICE_STOP = 0x00000020;
    private const uint SERVICE_PAUSE_CONTINUE = 0x00000040;
    private const uint SERVICE_INTERROGATE = 0x00000080;
    private const uint SERVICE_USER_DEFINED_CONTROL = 0x00000100;
    private const uint STANDARD_RIGHTS_REQUIRED = 0x000F0000;
    private const uint SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED |
                        SERVICE_CHANGE_CONFIG |
                        SERVICE_QUERY_STATUS |
                        SERVICE_ENUMERATE_DEPENDENTS |
                        SERVICE_START |
                        SERVICE_STOP |
                        SERVICE_PAUSE_CONTINUE |
                        SERVICE_INTERROGATE |
                        SERVICE_USER_DEFINED_CONTROL);


    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern Boolean ChangeServiceConfig(IntPtr hService, UInt32 nServiceType, UInt32 nStartType, UInt32 nErrorControl, String lpBinaryPathName, String lpLoadOrderGroup, IntPtr lpdwTagId, [In] char[] lpDependencies, String lpServiceStartName, String lpPassword, String lpDisplayName);

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, uint dwDesiredAccess);

    [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);      



    private bool ServicePasswordChange(string changePassword, string strServiceName)
    {
        try
        {
            IntPtr databaseHandle = OpenSCManager(null, null, SC_MANAGER_ALL_ACCESS);
            if (databaseHandle == IntPtr.Zero)
                throw new System.Runtime.InteropServices.ExternalException("Open Service Manager Error");

            IntPtr pServiceHandle = OpenService(databaseHandle, strServiceName, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
            if (pServiceHandle == IntPtr.Zero)
                throw new System.Runtime.InteropServices.ExternalException("Open Service Error");

            //This code is changing the password for the service.

            if (!ChangeServiceConfig(pServiceHandle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, null, null,
                IntPtr.Zero, null, null, changePassword, null))
            {
                int nError = Marshal.GetLastWin32Error();
                Win32Exception win32Exception = new Win32Exception(nError);
                throw new System.Runtime.InteropServices.ExternalException("Could not change password : " + win32Exception.Message);
            }
            return true;
        }
        catch (Exception ex)
        {
            ErrFromApi_Label.Text = ex.ToString();
            return false;
        }
    }