MSI with server core features checking - c#

I have created an MSI-package to install a WCF service and web application to Windows Server Core 2008 R2 SP1.
The installer-process needs to check if the required features to run the WCF and Web app are installed on this server, and install them only if required.
I believe that we'll need a custom action to achieve this.
Please, could does anyone know how to check and install features programmatically?
Looking forward to hearing from you guys.
Many Thanks,
Chris

I found this to check all feature already install in server core.
To install the server features, i used the Process class to call dism command.
Process.Start("dism.exe", "/online /enable-feature /featurename:IIS-ISAPIFilter");
With this, i could create custom action in MSI that could check and install server feature.

You can use MsiGetFeatureState and MsiSetFeatureState functions.
Please note that these functions use a MSI handle, so you cannot use an EXE or Installer Class Action. You can find a custom action tutorial here: http://www.codeproject.com/KB/install/msicustomaction.aspx

Related

Handler "ExtensionlessUrlHandler-Integrated-4.0" has a bad module "ManagedPipelineHandler" in its module list

To be honest, I've tried to turn a dirty trick on IIS and just when I thought that I was going to get away with it, I realized my workaround doesn't work. Here's what I've tried to do:
1) I have ASP.NET application which has Preloader class that inherits IProcessHostPreloadClient and does all the heavy initialization in Preload method implementation (application is complex and it's a part of an enormous system, so it requires approximately 2 minutes to establish connections to all necessary services and pre-instantiate some Unity registrations).
2) I have a lot of work that needs to be done on application shutdown (unsubscribing, disconnecting, disposing,...), and I guess the best place to do it is in *Application_End* method located in Global.asax.
3) Everything works just fine when I have user activity (first request after the Application Pool that contains aforementioned web application is started will cause *Application_Start* to be called and afterwards *Application_End* is called on Application Pool stop or recycle), but problems occur when there is no user activity and application tries to restart itself after being active for 48 hours (configured requirement). Since there was no requests, application officially didn't get started. Ergo, it can't be gracefully stopped since *Application_End* won't be called.
4) Now comes the messy part... I've tried to make a GET request from code at the end of the Preload method, and it worked. But this solution seemed bad to me, even though it worked. So, I've tried a lot of things, and the last thing I tried was this:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... and that has done it's purpose. *Application_Start* was called, (I've checked response, it was containing login page that was supposed to be displayed in initial request) and on Application Pool shutdown application ended gracefully by doing necessary work in *Application_End*.
BUT
After the application was started (preloaded and initiated) in this manner, this is what happened when I wanted to reach application via Web browser:
HTTP Error 500.21 - Internal Server Error
Handler "ExtensionlessUrlHandler-Integrated-4.0" has a bad module "ManagedPipelineHandler" in its module list
I am unable to figure this out. Can anybody tell me why this happens and how to fix it?
If I don't figure this out, I will go back to first solution (sending GET request from code) but this problem will bug me since I don't even have an idea what's wrong.
Try to re-register ASP.NET with aspnet_regiis -i. It worked for me.
A likely path for .NET 4 (from elevated command prompt):
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
http://forums.iis.net/p/1190643/2026401.aspx
If you're running into this error with Windows 8/Windows Server 2012 and .Net 4.5 follow these instructions here:
http://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html
Go to "turn Windows features on or off"
Then Internet Information Services
Then World Wide Web Services
Then Application Development Features
And then enable ASP.NET 4.5
This worked for me (although the wizard and wording is a little different in Windows Server 2012, but you'll figure it out). With this being said, why this is necessary after installing everything through the Web Platform Installer including all of the dependencies is completely beyond me...
Despite following most of the advice on this page, I was still getting problems on Windows Server 2012. Installing .NET Extensibility 4.5 solved it for me:
Add Roles and Features > Server Roles > Web Server (IIS) > Web Server > Application Development > .NET Extensibility 4.5
For Windows 10 / Windows Server 2016 use the following command:
dism /online /enable-feature /featurename:IIS-ASPNET45 /all
The suggested answers with aspnet_regiis doesn't work on Windows 10 (Creators Update and later) or Windows Server 2016:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Microsoft (R) ASP.NET RegIIS version 4.0.30319.0
Administration utility to install and uninstall ASP.NET on the local machine.
Copyright (C) Microsoft Corporation. All rights reserved.
Start installing ASP.NET (4.0.30319.0).
This option is not supported on this version of the operating system. Administrators should instead install/uninstall ASP.NET 4.5 with IIS8 using the "Turn Windows Features On/Off" dialog, the Server Manager management tool, or the dism.exe command line tool. For more details please see http://go.microsoft.com/fwlink/?LinkID=216771.
Finished installing ASP.NET (4.0.30319.0).
Interestingly, the "Turn Windows Features On/Off" dialog didn't allow me to untick .NET nor ASP.NET 4.6, and only the above DISM command worked. Not sure whether the featurename is correct, but it worked for me.
Run one of these commands :
For 32 Bit Windows OS:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
For 64 Bit Windows OS:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -I
This https://stackoverflow.com/a/13266763/1277458 works perfectly. But if you have 64-bit operation system use Framework64 instead of Framework in path:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
The problem
You are using SimpleWorkerRequest in a scenario that it wasn't designed for. You are using it inside of IIS. If you look at the prior MSDN link (emphasis is mine):
Provides a simple implementation of the HttpWorkerRequest abstract class that can be used to host ASP.NET applications outside an Internet Information Services (IIS) application. You can employ SimpleWorkerRequest directly or extend it.
Also, if you look at the MSDN documentation for the System.Web.Hosting namespace (SimpleWorkerRequest is in this namespace), you will also see something similar to the above (again, emphasis is mine):
The System.Web.Hosting namespace provides the functionality for hosting ASP.NET applications from managed applications outside Microsoft Internet Information Services (IIS).
The solution
I would recommend removing the call to SimpleWorkerRequest. Instead, you can use a Microsoft solution to make sure your web site automatically starts up after it recycles. What you need is the Microsoft Application Initialization Module for IIS 7.5. It is not complicated to configure, but you need to understand the exact options. This is why I would also recommend the Application Initialization UI for IIS 7.5. The UI is written by an MSDN blogger.
So what exactly does the Microsoft solution do? It does what you are trying to do - IIS sends a "get" request to your website after the application pool is started.
In my case (Windows 10 + IIS 10) i had to open "Turn Windows Features On or Off" and then go to Internet Information Services > World Wide Web Services > Application Development Features > and check ASP.NET 4.6
I solved this problem, adding in "Turn Windows features on or off"
The option ASP.NET 4.7
Making this its own post because this had me going for hours.
I saw maybe a dozen of similar posts here and elsewhere about this problema and the aspnet_regiis fix. They weren't working for me, and aspnet_regiis was acting odd, just listing options etc.
As user ryan-anderson above indicated, you cannot enter .exe
For those less comfy with things outside IIS on the server, here's what you do in simple steps.
Find aspnet_regiis in a folder similar to this path. c:\Windows\Microsoft.NET\Framework\v4.0.30319\
Right-click command prompt in the start menu or wherever and tell it to run as administrator. Using the windows "Run" feature just won't work, or didn't for me.
Go back to the aspnet_regiis executable. Click-drag it right into the command prompt or copy-paste the address into the command prompt.
Remove, if it's there, the .exe at the end. This is key. Add the -i (space minus eye) at the end. Enter.
If you did this correctly, you will see that it starts to install asp.net, and then tells you it succeeded.
Make sure that you have set your application-site version from v2.0 to v4.0 in IIS Manager:
Application Pools > Your Application > Advanced Settings > .NET Framework Version
After that, install your ASP.NET.
For 32-Bit OS (Windows):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
For 64-Bit OS (Windows):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
Restart your application-site in IIS Manager and enjoy.
I know this is an oldie, but thought I might add some value. For those of us running Server Core outside of a domain (domain members can just run Server Manager remotely to add/remove features/roles), you have to resort to command lines.
Powershell users can type "Install-WindowsFeature Web-Asp-Net45"
That should be equivalent to using server manager.
I was challenged by the same error message, with .net 4.7 installed.
The solution was to follow one earlier mentioned post to go with the "Turn Windows feature on or off", where the ".NET Framework 4.7 Advanced Services" --> "ASP.NET 4.7" already was checked.
Further down the list, there is the "Internet Information Services" and subnote "Application Development Features" --> "ASP.NET 4.7", that also needs to be checked.
When enabling this, allot of other features are enabled... I simply pressed the Ok button, and the issue was resolved.
Screendump of the windows features dialog
Installing .NET 4.7 worked for me. I only had 3.5 installed prior.
I'm working on Windows Server 2012. .NET Extensibility 4.5 feature is on. WebDAVModule removed.
I was still getting 500.21 error on ASP.NET route '/docs'.
Changing 'skipManagedModules' to false fixed the problem.
<applicationInitialization doAppInitAfterRestart="true" skipManagedModules="false">
<add initializationPage="/docs" />
</applicationInitialization>
Thanks to https://groups.google.com/forum/#!topic/bonobo-git-server/GbdMXdDO4tI
I had this problem and found that removing the following folder helped, even with the non-Express edition.Express:
C:\Users\<user>\Documents\IISExpress
This error started happening to me out of nowhere last week, affecting the existing web sites on my machine. I had no luck with it trying any of the suggestions here. Eventually I removed WebDAV from IIS completely (Windows Features -> Internet Information Services -> World Wide Web Services -> Common HTTP Features -> WebDAV Publishing). I did an IIS reset after this for good measure, and my error was finally resolved.
I can only guess that a Windows update started the issue, but I can't be sure.
You could fix it by change the "ExtensionlessUrlHandler-Integrated-4.0" type in iis to System.Web.DefaultHttpHandler
For me, removing WebDAV from my server caused the application to return a 503 Service Unavailable Error message when using PUT or DELETE, so I re-installed it back again. I also tried completely removing .NET Framework 4.5 and reinstalling it and also tried re-registering as suggested but to no avail.
I was able to fix this by disabling WebDAV for the individual application pool, this stopped the 'bad module' error when using PUT or DELETE.
Disable WebDAV for Individual App Pool:
Click the affected application pool
Find WebDAV Authoring Tools in the list
Click to open it
Click Disable WebDAV in the top right.
Ta daaaa!
I still left the remove items in my web.config file.
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
<system.webServer>
This link is where I found the instructions but it's not very clear.
This maybe not a usefull solution for OP but it concerns the same "error" message.
We are hosting PHP pages on IIS8.5 with .NET 4.5 installed correctly.
We make use of the preload functionality to make sure our application is always responsive across the board.
After a while we started getting this error at random.
In the web.config : I put skipManagedModules to true, -> don't do this!
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<applicationInitialization skipManagedModules="false" doAppInitAfterRestart="true">
<add initializationPage="/" />
</applicationInitialization>
...
Although website is php, the routing to the paging is managed by the modules!!!
I also ran into that problem. My MVC4 App is running on a Windows Server 2012 R2 with IIS 8.5. None of these posted solutions worked for me...installing the missing frameworks through IIS Features could have solved it but the installation always failed.
I had to use the Web Platform Installer and installed the following packages:
I was facing this issue in a web application hosted on a shared hosting server. So obviously did not have direct access to IIS, so could not apply many solution proposed here.
On the hosting provider's control panel I enabled error logging for IIS and ASP.Net. And then got to know that error actually lied in a missing cshtml.

How to make generic installation for my program

How to make generic installation for my C# program, that will work on Win XP, Win 7 32bit and Win 7 64bit ?
I need that all the related components (like Framework... Crystal Reports...MDAC....) will be include and will install only the program that the OS is missing
Thanks in advance
What version of Visual Studio are you using? It matters, because if you're using Express, you're going to need a 3rd party tool If you're using Professional or higher, you can just create a Setup project as described here:
http://support.microsoft.com/kb/307353
if you weren't worried about required components, of course, you could just do an XCOPY deployment, but since you specifically need your prerequisites included with the install, you need to use a tool like the setup project 9which creates an MSI file) or using a third party tool like Installshield.
i think
1- Create 3 separate packages for (Win Xp,Win7-32 , Win7-64)
2- Ask user if user is downloading from the website and push require download from the server. Alternatively , you can write a samll silverlight based application to get the details of user machine.
3- If 2 point is not true than while installing on a user machine get the details first and choose manually which pakage to install.
why i am telling to create specific package because of Microsoft issues pathches time to time and you may need to change the package so keep it seperate will definately help you.

How to make software developed in WinForms .NET 3.5 with SQL Express portable

i found that its really pain to create setup and deployment packages for windows xp/vista/7
so my question is can i make my application portable with any third party tool such as thin app ?
my application requires dot net 3.5 framework and sql express 05 installed i want to put it on usb drive and user can execute it directly from usb drive without any setup and deployment, if there any other ways to achieve portability for software please let me know?
thanks !
In order to check if .Net 3.5 and sql express is installed you can check if they are registred in the registry.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion - CurrentVersion
But you cannot check this with your 3.5 compiled assembly, so you need a non-dotnet application to do it, like a setup program.
Either you have to create a launcher in something like c++, or you could create a vb script launcher which checks the prerequisites before launching your .net app.
Neither SQL Express nor the .NET Framework will not run without being installed on the local hard disk.
Source for SQL Express: http://social.msdn.microsoft.com/Forums/en-US/sqlsetupandupgrade/thread/fc729d31-8a0b-4156-ab75-4fec652a438b.
#Mikael already told the trick for .NET detection which you should take a look at.
I just want to add that for portable applications, you should use SQL Server Compact edition instead of Express,
Link

What Order to Deploy .NET Application with SQL Server 2008?

I have created an Windows application.
I used
FRONT END : C# (VISUAL STUDIO 2008)
BACK END : MICROSOFT SQL SERVER 2008
.NET FRAMEWORK : 3.5
Now after deployment when I am installing the application in my Clients machine is it necessary to first install .Net Framework, VisualStudio2008 and Sql Server 2008 before installing Application?
And in which module of building my set up file(FileSystem Editor, Registry editor etc..) should I attach the DataBase?
This is my first application of deployment so please help me out with tips and tracks for deployment?
Thanks in advance!!
You customer will not use Visual Studio, so you don't need to install it.
You will need to install SQL Server manually. You cannot have your setup project install it automatically. Just install SQL Server 2008 (SP1 or higher). I believe this will install all or most of .NET 3.5 for you. If not, then when your setup is run, it will install any other parts of .NET that are needed.
BTW, be sure to test the installation steps on a clean system of your own (maybe on Virtual PC) before trying it on your customer's site!
It depends if you want every client to have SqlServer installed locally (usually, on an Enterprise scenario, you have already a server box with Sql Server running, and you just need to deploy your database there).
If having Sql Server running locally is a requirement, you might want to take a look at this thread which will help you: How to install a custom desktop application database to SQL Express?
You should install SQL Server manually before installing your application.
You just need to install you application, you do not need visual studio. If you use a setup project to do this it should detect that it requires the .Net framework and give the user the option of installing it.
You don't have to install the Visual Studio. For running .Net applications, you only require .Net Framework. And for SQL 2008 also .Net required. And for Database, either you have to run SQL Script or you may need to restore the database. Running SQL Script is better I think, you can do it via a Batch file.

Advanced installation regarding to C#

I want to make an advanced installer for my C# application. |I want my application continue its installation after the pre-requisites been installed.
My scenario is:
myApplication requires .net Framework 2
it redirects the user to the Microsoft website.
the user installs the framework.
the installation requires to restart the PC.
STOPPED INSTALLATION
After this step (after restarting) I want myApplication to continue the installation (go to the last stage of the installation)
Any suggestion on how I do this ?!?!
I would suggest taking a look at the nullsoft install system. Use the Modern UI theme and the DotNET macro (http://nsis.sourceforge.net/DotNET). That's everything that you are looking for prebuilt, for free, and you can be up and running with very little effort.
I've had experience releasing applications with this route and it works very well.
Things like InstallShield, or one of the other installer creation tools would be able to handle the pre-requisite side of things for you. If you want to roll your own, then you could check for the framework, perform the various steps you mentioned to install it, then add you setup application to the RunOnce registry key so it starts again on startup.
Looking at something that would handle all the pre-requisites etc for you would be my choice though :-)
Install in this order:
Install the .NET framework
Install your app.
Restart if needed.
You can create an installation project in VS2005/8 to handle installing your app and any needed dependencies.
Are you aware that your compiled c# app itself will do this? The bootstrapper compiled into a .Net exe will contain a redirect to get the framework with a working link to the microsoft website.

Categories

Resources