views:

1417

answers:

2
Process process = new Process();

ProcessStartInfo psi = new ProcessStartInfo(@"C:/PsExec.exe");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.WindowStyle = ProcessWindowStyle.Minimized;
psi.CreateNoWindow = true;
psi.Arguments = "PsExec \\\\Newton -u Administrator -p Password IISReset /stop";

process.StartInfo = psi;
process.Start();

The above is my code i am not able to stop the IIS from the C# code but if i execute

PsExec \\Newton -u Administrator -p Password IISReset /stop

directly in command prompt i can stop it

Can anybody help me on this

Thank You in advance

Selwyn

A: 

You don't need the "PsExec" again in the arguments, ie.:

Process process = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"C:\PsExec.exe");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.WindowStyle = ProcessWindowStyle.Minimized;
psi.CreateNoWindow = true;
psi.Arguments = "\\\\Newton -u Administrator -p Password IISReset /stop";

process.StartInfo = psi;
process.Start();
Rowland Shaw
Also the slash in the second line should be a backslash
Oliver
no even after removing the PsExec its not working any other idea
Selwyn
Are you getting any errors? Is PsExec *really* installed to the root of C: ?
Rowland Shaw
yes from the command prompt i can easily execute the command
Selwyn
A: 

Any reason you can't use the ServiceController class?

ServiceController svc = new ServiceController("servicename", "machinename");
svc.Stop();

If you need to impersonate a user for the server in question, you can use this class:

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

/// <summary>
/// Impersonate a windows logon.
/// </summary>

public class ImpersonationUtil {

    /// <summary>
/// Impersonate given logon information.
/// </summary>
/// <param name="logon">Windows logon name.</param>
/// <param name="password">password</param>
/// <param name="domain">domain name</param>
/// <returns></returns>
public static bool Impersonate( string logon, string password, string domain ) {
 WindowsIdentity tempWindowsIdentity;
 IntPtr token = IntPtr.Zero;
 IntPtr tokenDuplicate = IntPtr.Zero;

 if( LogonUser( logon, 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();
   if ( null != impersonationContext ) return true;    
  }   
 }

 return false;
}

/// <summary>
/// Unimpersonate.
/// </summary>
public static void UnImpersonate() {
 impersonationContext.Undo();
} 

[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser( 
 string lpszUserName, 
 String lpszDomain,
 String lpszPassword,
 int dwLogonType, 
 int dwLogonProvider,
 ref IntPtr phToken );

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

private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 4;
private const int LOGON32_PROVIDER_DEFAULT = 0;
private static WindowsImpersonationContext impersonationContext;

}

Chris

Chris Dunaway
i want to stop the iis remotely but have some access problem
Selwyn