I'm using some custom actions to install plugins into Firefox in an Installer project.
Quickest path to ground thus far has been to use VBScript.
Currently, I've been assuming the FireFox installation directory is "%PROGRAMFILES%/Mozilla Firefox". Obviously, this needs to change to cope with people doing non-standard installs.
So, the question is, how can I get an installation path of an application (known by name, GUID, whatever) using VBScript*?
*If its downright impossible, using C# is also acceptable (and seems to be answered in a few places) but that will require I redo some of the installation process currently implemented in VBScript; so its less desirable
There is an Install Directory string in the registry that will tell you where it's installed, however it's located in different places depending upon the version of Firefox is installed and the OS upon which it is installed. It will be in a key that looks like one of these:
Windows XP
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\3.5.3 (en-US)\Main
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\3.0.11 (en-US)\Main
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\3.0.5 (en-US)\Main
...
Windows 7 x64
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla\Mozilla Firefox\3.5.3 (en-US)\Main
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla\Mozilla Firefox\3.0.11 (en-US)\Main
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla\Mozilla Firefox\3.0.5 (en-US)\Main
...
Related
Trying to update my 32-bit Cygwin install on a Windows 10 64-bit fresh install and every setup-x86 I have tried fails with errors.
I had it all working on my old system, which was a Windows 7 upgrade to Windows 10. My 3rd party SDK with Cygwin plus an upgrade was installed a good few years ago while on Windows 7 then did the Windows 10 upgrade thing. I could still compile my code for an embedded processor device with no errors after that.
But Microsoft corrupted my system with the last update (December 2022) so my system was unbootable and irreparable by any of their troubleshooting Advanced methods.
So I put a new hard drive in and installed windows 10 from scratch.
Two weeks later I have reinstalled much software but now I am at my SDK re-install and cannot get any Cygwin version to download.
I have a 3rd party SDK which instructs me to install their Cygwin first (version 1.5.18) then remove some environment variables, then go to http://www.crouchingtigerhiddenfruitbat.org/Cygwin/timemachine.html and Follow the “Dead Simple Instructions" and go for "any version 2017 +".
After downloading the files I must copy the directory to my original install directory, thus upgrading the install.
I just cannot download anything though.
I went to that time machine page and was totally confused. I noticed they said "this is the last 32 bit install" on several places, so I tried clicking on all those setup-x86 links.
I tried running the downloaded setup-x86 files from the download directory but each one failed.
On most of the more recent setup-x86 files,(like 2.924) it shows a small blue square telling me Windows protected me etc. I click Run anyway and then it says "Cygwin is not supported on 32-bit windows".
So I tried earlier versions like 2.909 and they show the interface; I choose download, then choose the download directory ( a folder on my desktop) then I have tried both direct connection and use system proxy; then I select a mirror (tried all of them, I think) and it begins some action then stops with errors like:
"https:\cygwin.mirror.constant.com\x86\setup.ini line 12: The current ini file requires at least version 2.924 of setup. Please download a newer version from https://cygwin.com/setup-x86.exe"
But I have already tried 2.924 and it gives the "Cygwin is not supported on 32-bit windows" error!
With setup-x86-2.874.exe, it shows the interface etc. but in the mirror list all I see is http://update.setup.invalid.
With 2.774 it does the interface then "Unable to get setup.ini from 'my selected mirror url'.
Then I tried that page https://cygwin.com/install.html#unsupported, where I tried the circa urls and did these from an Administrator command line, as they say. No good- errors.
Under "Dead Simple Instructions"(no they are not) I followed the link to the machine top level snapshot index, but each link their only gives a plain text list of files- nothing downloadable!
Anyway, copied a url link and then at step 4 it says click for setup-x86. So I did but that blue windows protection square appears. I say run anyway but then it says "Cygwin is not supported on 32-bit windows"!
I am at my wits end! It all worked fine on my old system until Microsoft ruined it with their updates.
How can I get a newer cygwin update for my v1.5, s the 3rd party instructions say???
Aha! I believe I have finally got this to work.
I just found a new release of the instructions for the 3rd party software SDK. They mention version 2.9.0 as the new version they are moving to.
I cannot access their download but I went back and read the Cygwin Time Machine page carefully again (http://www.crouchingtigerhiddenfruitbat.org/Cygwin/timemachine.html).
Under "Dead Simple Instructions", I looked through the list of dates and versions (http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/index.html) and found 2.9.0-1; surely close enough, eh?
So I copied the URL shown there.
Step 4 Run setup-x86.exe downloaded the setup file and Itried it from an Admin CMD prompt, adding the -X and -D switches. It failed with the 32 bit error, as before.
OK so I read again and near the bottom of the page I spotted "Cygwin Setup Archive".
Ah... I went to the link provided there (http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/setup/setup.html) and found setup-x86-2.901.exe.
After it downloaded, I again used the command prompt to run this and an interface appeared.
I was able to choose the existing install directory, the temporary download directory and add the URL I had copied earlier.
It proceeded to get the list of packages correctly.
I then selected to view files that were installed but may need updating and clicked Next.
It all went correctly. Thanks to Doug who offered help already.
So there is a way to do this.
If anyone was looking for the solution, I found the answer in the Cygwin mailing list. You must launch the setup-x86.exe (setup-x86-2.924.exe) with the --allow-unsupported-windows option --site circa_URL arguments, much like the -X switch was used on prior legacy installers to disable signature checking. circa_URL here is a mirror of legacy repos for Cygwin, where http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/2022/11/23/063457 is the suggested url in the mailing listing post.
Apparently, if you are on a true x86, non-64-bit, Windows OS, this flag is not necessary, though I think the repo mirror may be required.
How would I get a list of EVERY program into a text file for windows 95-windows 10. The uninstall programs in control panel doesn't have the version and publisher for the older operating systems, and wmic does not display every program. Even the uninstall registry, which I thought would be my savior, does not list every program. I can see discrepancies between that and the uninstall programs tab. Powershell and the like are off the table since it is relatively new.
Some combination of the following:
Enumerate registry for HKEY_CURRENT_USER\Software\Microsoft\CurrentVersion\Uninstall and HKEY_LOCAL_MACHINE\Software\Microsoft\CurrentVersion\Uninstall. And probably HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall on 64-bit os (might be duplicated). These are the list of installed programs that appear in the Control Panel's "Program and Features" section. Notice that some of the entries are straight-forward and have most of the data you want. Others are a GUID - this corresponds to an MSI installation.
For all the entries obtained in #1 that reference a GUID, use the MSI API to find the installation information you seek. Start with MsiEnumProducts. From there you can get at version info of installed applications.
Brute force search for EXEs installed in C:\Program Files and C:\Program Files (x86). For each EXE found, you can use this method to get the version information.
You want a list of applications installed from the Windows Store? Ask me for a code sample if that's important too.
The registry uninstall registration requirements in the 90's was just the display name and the command to start the uninstallation. Windows 2000 added support for more values and exposed them in the new UI but they were still optional. In recent years a couple of them became a requirement to pass the Windows Logo tests but they are still optional for non-certified applications so the uninstall key is not guaranteed to contain version/publisher information for every entry. Portable applications are not listed in the registry so if you need a inventory of everything then you need to inspect all exe files and ignore the registry.
Supporting everything back to Win95 RTM is going to be tough since you have nothing except batch files as a scripting option. VBScript is a optional component that normally gets installed with IE 4 and I don't even remember if it is possible to get Powershell on these systems.
I don't think it is possible to extract the version information with a simple batch file, you probably need the help of a 3rd-party tool. The issue with 3rd-party tools is that a lot of them depend on the Microsoft CRT run-time .DLLs and Windows 95 RTM does not have them out of the box, not even msvcrt.dll.
If you can raise your requirement for Win95 to have Windows Scripting Host installed (redistributable or part of IE4) then you could write a VB/Jscript file that uses the FileSystemObject to both walk the entire directory tree on every drive and to get version information from .exe files.
If that is unacceptable then you need to try to find a tool that can extract version information. There is a Microsoft tool named filever.exe listed here but I don't know if it works on Win95 and a NirSoft tool here but I'm not sure if it supports stdout redirection from the commandline (but it is open source so you could fix that if needed). Even if you find a suitable tool you would still need to walk the directory tree looking for .exe files and that is not going to be fun when you are limited to command.com and its DOS compatible batch handling.
My recommendation is to write a new application. I can't recommend writing it in a .NET language because you would be dealing with versions 1-4 and it is not installed on XP and older by default.
The way I see it, you have 3 options if you are writing it yourself: Visual Basic 6, Delphi (something old, v3 or older perhaps) or C/C++.
For C/C++ any version of Microsoft Visual C++ or MinGW/GCC will do but the older the better and you must not link to or use any C run-time library stuff (you might get away with static linking with MinGW but not recent versions of Visual Studio). If I was doing this I would use Visual Studio 6 or 2003 and build with /Zl & /NODEFAULTLIB. There are multiple small standalone CRT libraries if you need them. If you use any recent version of Visual Studio you will manually have to hex-edit the file to make it run on anything older than XP.
The actual implementation needs to call FindFirstFileA (and friends) on Windows 95/98/ME and FindFirstFileW on other systems to walk the directory tree and GetFileVersionInfoA/W (and friends) to get version info.
If you are feeling fancy you could perhaps filter out files in %WinDir% signed by Microsoft. Good luck...
According to the Windows installation rules, programs should be installed to
C:\Program Files (64-bit program / x86-64) or C:\Program Files (x86) (32-bit program / x86). The program is copied into a sub-sub-folder containing the vendor name and the program name.
But why doesn't Chocolatey install packages into C:\Program Files\<Vendor>\<Program>\?
10. Apps must install to the correct folders by default
Users should have a consistent and secure experience with the default installation location of files, while maintaining the option to install an app in the location of their choice. It is also necessary to store app data in the correct location to allow several people to use the same computer without corrupting or overwriting each other's data and settings. Windows provides specific locations in the file system to store programs and software components, shared app data, and app data specific to a user
10.1 Your app must be installed in the Program Files folder by default
For native 32-bit and 64-bit apps in %ProgramFiles%, and %ProgramFiles(x86)% for 32-bit apps running on x64. User data or app data must never be stored in this location because of the security permissions configured for this folder.
Source: Certification requirements for Windows desktop apps
Version: 10 (July 29, 2015)
It depends on your version of Chocolatey, it's settings and the packages themselves.
To start, see Tools vs Applications and Chocolatey's distinction (
https://github.com/chocolatey/chocolatey/wiki/ChocolateyFAQs at the
bottom).
If the package does not use a native installer (a tool), it depends on
if the package author has used the bin_root concept that is up and
coming in a future version.
For example, SysInternals will go to c:/sysinternals right now unless
you have a defined $env:chocolatey_bin_root variable. The concept in
the code will change as well as right now this requires it to be a
subfolder of the system drive and I don't see us developing the final
feature with that limitation.
If the package doesn't have that concept yet, one can always ask the
package author to incorporate it.
If the package uses a native installer (an application), one can use
installArgs to pass arguments to the native installer
(https://github.com/chocolatey/chocolatey/wiki/CommandsInstall) and
tell it the directory to install the application to. This does require
you to know what you need to pass to the native installer. If you want
your applications in a custom directory, there is an assumption that
you are already an advanced user so it is expected that you would know
what to pass the installer if you were doing a silent install.
Slightly paraphrased from: https://groups.google.com/forum/#!msg/chocolatey/uucAz8GxebA/HEPAKp69d90J
Also,
NOTICE: As of 0.9.8.24, Chocolatey's default install location is
C:\ProgramData\Chocolatey
This reduces the attack surface on a local installation of chocolatey
and limits who can make changes to the directory.
Source: https://github.com/chocolatey/chocolatey/wiki/DefaultChocolateyInstallReasoning
And from personal experience I can attest that that concept is an excellent line of defense (when properly configured, used and understood).
PS:
As you already added to your answer, technically the requirement is %ProgramFiles% and %ProgramFiles(x86)% environment variable(s where applicable).
For example, %ProgramFiles(x86)% could as well point to P:\Software\Programs\x86\ (instead of C:\Program Files (x86)\).
There is obviously a lot of legacy software (now (re-)packaged) that never used a <vendor> section in the path-name.
Hope this helps!
So I have a compliled matlab code, 'Example.exe'...I want to create an installer package that does the following:
My exe file will reside on a network drive.
My installer will first ask the user for the installation path.
It will then copy the exe (along with some other supporting files) in the given path....IF the folder already exists, it will ask the user for overwrite confirmation.
After the copying is done, my installer will ask the user if they want to install the MCR and accordingly install it(or not).
After everything is done, a shortcut to the exe is created on the desktop.
My question is, is there some installer package generator that can do all this ?? I understand matlab can create an installer package, but I want my file to be copied from the network drive. I also don't have Visual Studio so, can't create an msi.
There's a simple way to do this, you'll need a software called IExpress, It can create a self-extracting executable (.EXE) or a compressed Cabinet (.CAB) file using the provided interface (IExpress Wizard). Its included in all versions of windows (I think..). To run the IExpress Wizard, go to your local drive then: Windows\System32, Search for "iexpress" then run the program.
then...
Follow these steps:
1. Run iexpress.exe
2. Create a new 'Self Extraction Directive' file
3. Extract files only
4. Specify the title, promt user options, license, etc
5. Start adding files to your package
7. Specify other options (window, message)
8. Enter the path where you want your package to be.
Then you're almost done, create your package (might take a few mins), distribute it, upload it and all.
For more details visit http://www.makeuseof.com/tag/how-to-make-an-exe-installation-file/
There is no simple way to do that. But if you tightly tied to Windows platform, you definitely can learn Windows Installer technology. It's NOT related to Visual Studio!
Just download WiX toolset (it is free and Open Source!) and learn MSDN docs about Windows Installer.
But it is complex way, remember. You can spent months learning how to make great Windows installers.
Ofcourse, you can use Inno Setup or NSIS, but I don't recommend that, because them re-engineer installer technology instead of native Windows Installer's.
If you want, I can learn you by Skype or something like. :-)
Or (isn't great offer?) I can write the installer for you and send you all code and describe which for what is.
Use iExpress! Available from win xoxo and over (xp)
With windows 8 pro you can make a package with your voice! Only with win 8 or 8.1 pro.
I'm looking for a command line arg that shows me what version(s) of vb are installed on my windows 7 dev machine.
Specifically I'm looking for VB6 information - if it's setup -what dll's are registered/etc
To what end? If you're interested in knowing from an installer point of view, about the only thing you can do is check the SYSTEM folder for the MSVBVM60.dll file (and possibly others depending on what parts of VB6 you've made use of).
But that file doesn't HAVE to be in SYSTEM32, it could be anywhere on the path, or in the app's folder itself.