Talking to the exe from the C# code [duplicate] - c#

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Launching a Application (.EXE) from C#?
I am trying to run an exe as a process from my C# code. The exe is a secure one and asks for a password before executing the command. I am unable to pass the password to the exe by any means. When i try to write a standard input it does not take it. Have anyone faced this kind of an issue. If so pls share your work arounds for the scenario. Thanks in advance
I am editing the post to make it a little clear. The exe that i am trying to run is a command line exe. Its a white listing tool provided by mcafee. What i am trying to do is to set the password to the exe so that i can make it secure. the command goes like this
sadmin passwd
once i execute the command it will ask me for the password i want to assign
new password:
once i enter the password it will ask me to re-enter password
re-enter password:
Once the password is set, subsequently when i run other commands on the sadmin, It will prompt me to enter the password
sadmin enable
password:
The password is not an argument to the command. It is passed to the prompt after running the command. So i am unable to achieve this by adding password as an argument to the command.

you can try
Process example= new Process();
example.StartInfo.FileName = "example.exe";
example.StartInfo.Arguments = "arg";
example.Start();

Have you tried using Process.StartInfo.Arguments? Something like this:
Process MyProcess = new Process();
MyProcess.StartInfo.FileName = "PathToExe";
MyProcess.StartInfo.Arguments = "YourArgsHere";
MyProcess.StartInfo.WorkingDirectory = "DesiredWorkingDir(Optional)";
MyProcess.Start();

Related

How to create a process as a another user without a password in C#?

I'm trying to create something in C# like sudo for Linux.
I found a way to run the process as a different user using the password, but I want to do this without the password.
Also, my C# software is running as Administrator and has passed UAC.
My currently Code:
static void CreateProcessAsUser(string name, string path, SecureString password)
{
Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = path;
proc.StartInfo.UserName = name;
proc.StartInfo.Password = password;
proc.Start();
}
Thank you.
Windows is not Linux, so you cannot expect a feature just like sudo.
No matter which programming language (C# or C++) you use, deep down inside you need to call RunProcessAsUser (no, not your current code as yours is far too simple for the purpose) to initialize a process running as another user account. This API in turn wants a user token, which you either create with user credentials (aka password) via LogonUser, or clone from an existing token via DuplicateToken.
So the only way to avoid password is to find a valid user token already on this machine (once that user logs on).
You might wonder what applications use such a complex mechanism and why. One example is your antivirus software, whose main component is a Windows service running as administrator. This service detects who logs on to the machine and then launches a tray icon application. (That's the perfect time to duplicate a user token and create a process as that user.)
If your goal is not to cover similar scenarios, I wonder whether you should continue on this path.

Why do cmd, runas and psexec open different associated applications? [duplicate]

This question already has answers here:
Process.Start() impersonation problem
(3 answers)
Impersonating in .net (C#) & opening a file via Process.start
(1 answer)
Closed 4 years ago.
I need to open documents/files with their associated application and a specific user in C#.
Problem 1: Process.Start() with Domain/Username/Password (in ProcessStartInfo) doesn't accept an (e. g.) image file anymore, it expects an executable then (e. g. cmd.exe).
Problem 2: Process.Start() with Username "doesn't find the directory" when I try to call cmd.exe.
Problem 3: When using "runas" I cannot supply the specific user's password.
Problem 4: When using "psexec" (which takes a password) Windows 10 asks me for the application to open the image with. (But it works fine with e.g. an Excel file.)
Why is "cmd" just opening the image fine with the Windows image viewer while "runas" opens the image with Paint.net and "psexec" asks for the application???
var cmdParamsA = #"c:\temp\Image.png";
Process.Start("cmd", cmdParamsA);
var cmdParamsB = #"/noprofile /user:domain\user cmd /k start c:\temp\Image.png";
Process.Start("runas", cmdParamsB);
var cmdParamsC = #"-u domain\user -p password cmd /k start c:\temp\Image.png";
Process.Start(#"c:\temp\PsExec.exe", cmdParamsC);

Execute Unix commands using putty in C# [duplicate]

This question already has answers here:
Run Unix commands using PuTTY in C# [duplicate]
(2 answers)
Closed 3 years ago.
Hi I have the below code,
I am able to open putty session but i was not able to give the inputs using C# , i have tried using process.StandardInput.WriteLine but it is not working . Please help me.
class Program
{
static void Main(string[] args)
{
Process process = new Process();
process.StartInfo.FileName = #"C:\Users\win7\Desktop\putty.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.Arguments = "-ssh mahi#192.168.37.129 22 -pw mahi";
process.Start();
process.StandardInput.WriteLine("ls");
}
}
Hi All , I Have used Plink instead of putty by the suggestion given by Onots.
I have done the following
1.Edited my path in environment variable to my plink location i.e., D:\Plink\
2.Manually Opened Command Prompt and Logged into my host server using plink using the command
plink-0.57.exe -ssh mahi#192.168.37.129 -pw mahi and i am able to execute commands manually.
3.Now i have modified the code as below
class Program
{
static void Main(string[] args)
{
Process process = new Process();
process.StartInfo.FileName = #"D:\Plink0.57\plink-057.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.Arguments = " -ssh mahi#192.168.37.129 -pw mahi";
process.Start();
process.StandardInput.WriteLine("ls");
}
}
But i was not able to open plink and the command is not executing using C#. But what happens is , a command prompt just appears and closes immediately , i have figured the error message as
"Unable to write to standard input"
Please help me ,i am not able to proceed any further. Thanks In Advance.
Wouldn't it be easier to use the command line Plink (PuTTY Link) instead of the GUI? I believe that it is more suitable for automated tasks.
See http://the.earth.li/~sgtatham/putty/0.63/htmldoc/Chapter7.html#plink for example usage.
I will quote the relevant part here, just in case the link goes bad:
7.2.2 Using Plink for automated connections
More typically Plink is used with the SSH protocol, to enable you to
talk directly to a program running on the server. To do this you have
to ensure Plink is using the SSH protocol. You can do this in several
ways:
Use the -ssh option as described in section 7.2.1. Set up a PuTTY
saved session that describes the server you are connecting to, and
that also specifies the protocol as SSH. Set the Windows environment
variable PLINK_PROTOCOL to the word ssh. Usually Plink is not invoked
directly by a user, but run automatically by another process.
Therefore you typically do not want Plink to prompt you for a user
name or a password.
Next, you are likely to need to avoid the various interactive prompts
Plink can produce. You might be prompted to verify the host key of the
server you're connecting to, to enter a user name, or to enter a
password.
To avoid being prompted for the server host key when using Plink for
an automated connection, you should first make a manual connection
(using either of PuTTY or Plink) to the same server, verify the host
key (see section 2.2 for more information), and select Yes to add the
host key to the Registry. After that, Plink commands connecting to
that server should not give a host key prompt unless the host key
changes.
To avoid being prompted for a user name, you can:
Use the -l option to specify a user name on the command line. For
example, plink login.example.com -l fred. Set up a PuTTY saved session
that describes the server you are connecting to, and that also
specifies the username to log in as (see section 4.14.1). To avoid
being prompted for a password, you should almost certainly set up
public-key authentication. (See chapter 8 for a general introduction
to public-key authentication.) Again, you can do this in two ways:
Set up a PuTTY saved session that describes the server you are
connecting to, and that also specifies a private key file (see section
4.20.8). For this to work without prompting, your private key will need to have no passphrase. Store the private key in Pageant. See
chapter 9 for further information. Once you have done all this, you
should be able to run a remote command on the SSH server machine and
have it execute automatically with no prompting:
Z:\sysosd>plink login.example.com -l fred echo hello, world hello,
world
Z:\sysosd> Or, if you have set up a saved session with all the
connection details:
Z:\sysosd>plink mysession echo hello, world hello, world
Z:\sysosd> Then you can set up other programs to run this Plink
command and talk to it as if it were a process on the server machine.
The following code gives the solution
class Program
{
static void Main(string[] args)
{
ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = #"D:\Plink0.57\plink-057.exe";
startinfo.Arguments = "-ssh mahi#192.168.37.129 -pw mahi";
Process process = new Process();
process.StartInfo = startinfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.Start();
process.StandardInput.WriteLine("ls");
process.WaitForExit();
Console.ReadKey();
}
}

Change System Date in Windows 7+ via C# windows Service with Domain User [duplicate]

This question already has answers here:
Running CMD as administrator with an argument from C#
(5 answers)
Closed 8 years ago.
kindly help me to solve the following problem.
I am trying to change computer Date via C# Windows Service. The following command
this command is working in C# windows application if i run it as RUN AS Administrator. but the service is not changing system date by the following command. my pc is on domain and i run this service as domain service account. also i add service#domain account to system administrator group.
string strCmdText = "/c DATE ";
System.Diagnostics.Process.Start("CMD.exe", strCmdText);
how could i run cmd as run As Administrator in C# Service which is already run as domain user.
i tried all the solutions which is provided here but still the problem is remain.
To run CMD in administrator privilage, you simply have to run an application in administrator privilage.
But better way to call an program from console will be using Process object (not static method), where you have more options, eg. can read output, etc.
Process p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "date";
p.StartInfo.Arguments = "";
p.Start();
Then to input data to the application you have to use StandardInput field of Process class
p.StandardInput.Write(string yourDate);
And at the end you can gently wait for application to finish it's job.
p.WaitForExit();
To read data from output you have to use this command:
string output = p.StandardOutput.ReadToEnd();
You can also read this line by line (if you have to):
string[] oLines = output.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);

C# Launch command as administrator

I am trying to launch csript as an administrator (the account logged in has admin rights). setting the startinfo.verb to runas does not work.
ProcessStartInfo p1 = new ProcessStartInfo();
p1.UseShellExecute = true;
p1.Verb = "runas";
p1.FileName = "cscript";
p1.Arguments = "I:\\WPKG\\wpkg.js /synchronize /quiet /nonotify";
Process p = new Process();
p.StartInfo = p1;
p.Start();
The only way I can get it to start with privileges is to manually set the username and password. However I cannot hardcode that information or put it into configurations. Is there any way to have the cmd elevate without the login info?
I have also tried adding using (System.Security.Principal.WindowsIdentity.GetCurrent().Impersonate()) around the above code with no luck either.
Note: If I run the bat file directly, it works, if i run with password hardcoded, it works. It only fails to elevate launching from C# without login information.
This utility:
http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/
may help. Note too the comments in that post.
You have several choices:
Use the runas utility (not verb), and pass in the username and password to . You may need to do this manually once with saving the credentials (only good till a restart).
Pass in the username and password on the ProcessStartInfo (you will need to convert the password to a SecureString.
Use the runas verb (not utility) to interact with UAC, as described in this question.

Categories