run exe on server side from an asp.net Web page - asp.net

I need to run an exe located on the server in the same folder of the aspx web page
I have a button in the web page which when clicked will execute the exe and bring up the App Form.
This is the code-behind of the button present in the aspx page.
Protected Sub RunBtn_Click(sender As Object, e As EventArgs) Handles RunBtn.Click
Dim process1 As New System.Diagnostics.Process()
process1.StartInfo.WorkingDirectory = Request.MapPath("~/")
process1.StartInfo.FileName = Request.MapPath("App.exe")
process1.Start()
End Sub
It works perfectly on localhost. But when I upload and click the button, NOTHING HAPPENS!!
The page just sits. No error. The exe doesn't show up. Nothing!!
Probably have been asked before but I didn't find any solution. Please help guys.

You can't run any software like this in the website. The program probably started on the server and that's where it showed up (if you even have sufficient privileges for doing that).
Not sure what kind of software is that you're trying to run, but you have to convert it to be a web application instead.

When you use process.start it will start the new process rom the context of the process it was started from. In asp.net this will be the web server. When you are debugging from Visual Studio you are probably using the development webserver, which runs under your user account. When run on a "real" web server it will be run under IIS as a service. IIS runs by default under a restricted permission account that is not allowed to interact with the desktop at all. The application MAY be running as a background process, but won't be allowed to show a UI.
Your best bet to get this working is to have a separate process on the web server that polls either a database or a file on the system something that triggers the executable to run. You can pass arguments and other options through the file.

Related

How to set IIS users/permissions to execute a Process.start() in the web application?

I have a powershell script file called Script1.ps1 And I execute it from a web application in ASP.NET with the following code:
process.StartInfo.FileName = #"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe";
process.StartInfo.Arguments = $"-File \"{ScriptNameOne}\" \"{param1}\" \"{param2}\" \"{param3}\"";
process.StartInfo.UseShellExecute = true;
process.Start();
The problem is when I deploy my web app in IIS the process doesn't start.
I don't get any error, just my powershell doens't run.
the code works fine in my IIS express from visual Studio, because my user in the computer is executing all the process, so I have permissions to every source in the machine.
Important: I need to execute this powershell script LOCALLY IN THE SERVER WHERE THE SITE IS.
I know that is user/permissions Issue, so...
In IIS, which permissions do I need?
What of all IIS users should I use?
Do I need give permissions in the folder where the powershell.exe is?
ASP.NET Web page and server control code executes in the context of the ASP.NET worker process on the Web server. If you use the Start method in an ASP.NET Web page or server control, the new process executes on the Web server with restricted permissions. The process does not start in the same context as the client browser, and does not have access to the user desktop.
Give permission for ASP.NET worker process account
to interact with desktop or allow ASP.NET worker process to run in SYSTEM account.
To know how to allow worker process to run in SYSTEM account and to know the default permissions of ASPNET account, check this article INFO: Process and Request Identity in ASP.NET: http://support.microsoft.com/default.aspx?scid=kb;en-us;317012
Enable IIS Admin Service to interact with desktop
To configure this, follow this steps.
a. Open Control Panel and follow these steps: For Windows NT: click Services. For Windows 2000, Windows XP, and .NET Server: click Administrative Tools, and then click Services.
b. Double-click IIS Admin Service.
c. On the Log On tab, select the Allow Service to Interact with Desktop check box. Remember to run IIS Admin Service as a local system.
d. Stop and restart the IIS Admin Service.
More infor about this question you can refer to this link: https://stackoverflow.com/a/4679686/13336642.
WHAT WORKED FOR ME:
Right click the directory where the .EXE file is and select Properties
Select the Security tab
Click the Edit button and then Add button
Click the Locations button and make sure that you select your computer
Enter IIS AppPool<appoolname> (eg: IIS AppPool\DefaultAppPool)
https://support.pkware.com/home/smar/latest/sem-knowledge-base/kb-granting-folder-permissions-to-iis-application-pools

How can I execute an EXE file in asp.net website?

I have a website in asp.net with VB, and I have a link to a medical program that is installed in PC, when I click the link I want to execute the .exe for this program. I found this code but it´s works only when my project is locally:
System.Diagnostics.Process.Start("C:\Windows\System32\MiProgram.exe")
I also tried with this code:
Dim OpenDoc As ProcessStartInfo = New ProcessStartInfo
Dim stPath As String = "C:\Windows\System32\MiProgram.exe"
OpenDoc.FileName = stPath
OpenDoc.Verb = "open"
OpenDoc.WindowStyle = ProcessWindowStyle.Normal
Process.Start(OpenDoc)
Both codes works locally, but when I get my project to the web, does nothing
I also read that I can enable de IIS Service, I follow the steps of this page, but is not use to me.
Is there any solution to this problem?
I accept suggestions.
Thanks.
Unfortunately, it is not possible to run a program on the client from server-side.
There is already some discussions about that, here is some links :
How to execute an application on the client from a website?
Run an exe in client machine from a website
Executing exe on client side using C#
You can do this with a work around..
You create a running Windows Forms application, on that application you host a wcf services, check this link as sample.
Expose a method like `RunApplication' put the same code their, where you can call it from your website, this will 100% work.
You can try by implementing this settings:
In IIS 7/8 go Control Panel / Program And Features / Turn Windows
features on or off, and check all items from: Web Managment Tools,
(it's include: IIS Managment Service, II 6 Managment Compatibility)

Deployment of web application in VS 2012 to my server

I have Web Application which I would like to deploy to my web server. I do not want to use Windows Azure, I have my own server. I even do not have my profile to publish to Azure. I believe it is OK to not have the profile and continue using VS2012. I would like have complied binary files and all my pages (master, aspx) together with my controls (ascx), js, css files and without code-behind files placed in my local folder. Then I plan to pack them and copy to my server through FTP. Sounds trivial. But...
When I hit right click over my Web Application project and then "Publish...", I have Publish Web window. The first step asks me if I want to publish to Windows Azure. In this case I have to provide my profile which I do not have. I do not need it. I just want to deploy to my local folder all except code-behind files. I cannot choose the next step which is "Connection". So I hit "Publish" button. And now, now I am stuck, because I have to provide my profile (see attached screenshot). Could you tell me how I can prepare my web application for deployment to my web server? Thank you.
If you are not planning on using Azure, simply ignore the statement at the top of that screen, it is only helpful if you are publishing to Azure.
To get past this step, click on the drop down and then click "New profile".
After that you will be taken through the rest of the wizard were you can setup your connection details etc.

Run console application (.exe) from within ASP.NET application (IIS 7,5)

I have an ASP.NET application on Windows 2008 R2 (.NET Framework 4.0, IIS 7.5) and I want to run a console application when I click a button on a web page. Here is the code:
protected void btnUpdate_Click(object sender, EventArgs e)
{
string fileLocation = #"D:\DTDocs\App_Code\LoadDTDocsXML.exe";
ProcessStartInfo oStartInfo = new ProcessStartInfo();
oStartInfo.FileName = fileLocation;
oStartInfo.UseShellExecute = false;
Process.Start(oStartInfo);
}
When I run ASP.NET application from within Visual Studio 2010 (with its internal IIS), the console application run Ok. But when I run the ASP.NET application outside the VS 2010, I haven't an error but the console application doesn't make his job (it must create an xml file on the disk).
I think the problem is the configuration of IIS 7.5, I don't know exact to which account I must give access rights to the folders involved in my console application.
In IIS 7.5, I set Physical Path Credential for Specific User = my windows account, but that not solve the problem.
Thanks.
Just to add to the other 2 answers - Do you really need to run an exe from your webserver?
I've had to do it in the past and it's almost always the option of last resort - It weakens your security considerably (Now all someone has to do to run executables on your system is find a single flaw in your code) and has a whole host of other problems (the webserver isn't "logged on" to the server so it doesn't have a desktop, impersonation is a real pain in the a$$ to get working properly (assuming you're going to run the executable with different permissions to the webserver), etc.
If there's any other way to accomplish your goal, it'll almost certainly be simpler.
An option we went for was to have a new app with a WCF endpoint that the webserver can communicate with. So, when someone pushes the button, the WS call's our app via WCF and tells it to run various commands. This way, you've got:
Clean seperation between web and console code.
A dodgy console app won't take down the webserver & vice-versa
If the console app is long-running, this allows you to stagger your releases for website/console app so that you don't kill the app mid-execution just because you need up upodate some CSS and publish.
Huge security benefits - web server can't run executables even if compromised.
The WCF app will be able to closely examine requests to decide if they're valid before execution.
Be aware that however you do it, if someone malicious works out what's going on and can kick off the process, they could probably DoS you with almost zero effort - Make sure that this method is locked down TIGHT.
Edit: having read your comments above, I think you're hitting the "desktop" issue. When launching an executable from the server, the app will never be visible to the logged on user as the logged on user's desktop isn't accessible from IIS and vice-versa. This is very similar to the issue of having a GUI on a windows service.
This may also be of interest.
the first problem I see is security/file access. when running from within VS the server and client are the same machine under your credentials. when run in testing/production environment the server and client are physically different machines and IIS will run the website under restricted permissions. therefore there is a very good chance that IIS cannot access the file at D:... because of security.
the next issue is running a console app from the website. console is another form of UI just like html and a WPF. personally I wouldn't execute the console from the web (unless there was no other choice). I would integrate the API into the web application. 2 UIs sharing the same logic.
ASP.NET Dev Server runs under credentials of current user (it's you).
IIS 7.5 runs ASP.NET applications under user specified in application pool settings -- usually ApplicationPoolIdentity (to which you can refer as user "IIS AppPool\[ApplicationPoolName]", when configuring file permissions). You can also change it to "Network Service" (Default value in IIS 7.0).
Please check, which identity is configured for your application pool, and give this user required permissions.

Debugging two web applications in asp.net

I have a solution file containing multiple web applications and components. Mostly these web applications operate independently of one another, but I need to be able to response.redirect from one application to another. This works, and the new page runs, but I can't step into the code in the second web app and debug it.
I have both web applications set to "Always Start When Debugging" = True, with the first web app (the one that's redirecting) set as the startup web application. Does anyone know a trick that will let me step into the code in the second web application?
Open up a second instance of Visual Studio, then Ctrl+Alt+P (menu Tools > Attach to Process) then attach to the appropriate web server process (if you run under IIS this may be w3wp.exe or aspnet_wp IIRC, if you use the built in web server then attach to the process which lists the appropriate port for your project).
Optionally just run the second one and manually go to the first one in your browser by entering the appropriate address and trigger the redirect which you have verified is working.
Are both web applications running in the same process? What version of ASP.Net, IIS, and the .Net framework are you using? Those are my initial questions before I start giving other ideas.

Resources