Home > Enterprise >  msiexec Powershell silent install
msiexec Powershell silent install

Time:07-24

I am searching for a Powershell Script which allows me to silent install a msi file. We have over 25000 PCs so i have to do that with a script.

Unfortunately at the moment a window popping up (Windows Installer) after the execution which shows the parameter of a msi file. Nothing more, no other "error messages" are popping up.

The first thing the Script should do is to check if the PC is a Desktop or Mobile Device. If its a Desktop device he should write in a file "Desktop Configuration was used". In the same time the msi installer should start with some parameter. If its a Laptop the procedure should be nearly the same.

After the installation is successful the user should be signed out.

I need this script to implement 2FA in our company.

The code at the moment looks like this:

IF ( ((Get-ComputerInfo | select -expand CsPCSystemType) -LIKE "Desktop") )
    {
        Write-Output "Desktop Configuration was used." >> \\XXX\XXX\XXX\XXX\Log\$env:Computername.txt 
        
        
        msiexec.exe /i "%~dp0setup.msi" /passive /norestart /L*v "%~dp0setup.log"

    }    

ELSE {
        Write-Output "Laptop Configuration was used." >> \\XXX.XXX.XX\X\XX\XXX\XXXX\$env:Computername.txt 
        msiexec.exe /i "%~dp0setup.msi" /passive /norestart  /L*v "%~dp0setup.log"

    }   

Write-Output "Lock Configuration was used." >> \\XXX\XXX\XXX\XXX\Log\$env:Computername.txt
rundll32.exe user32.dll,LockWorkStation

Any help is really appreciated.

CodePudding user response:

The token %~dp0 (which resolves to the directory where the current script resides in) only works in batch scripts.

In PowerShell, replace $~dp0 by $PSScriptRoot. That should solve the problem of msiexec showing up with the available command-line options.

Another problem of your script is that msiexec runs asynchronously, when called directly as a command. So your script will be finished while the installation is still running, which is propably not what you want. This is caused by msiexec.exe being a GUI application. To run GUI applications synchronously, use Start-Process -Wait.


$Arguments = "/i", "$PSScriptRoot\setup.msi", "/passive", "/norestart", "/L*v", "$PSScriptRoot\setup.log"
$msiProcess = Start-Process msiexec.exe -Wait -ArgumentList $Arguments -PassThru

# Check if installation was successful 
# 0 = ERROR_SUCCESS, 3010 = ERROR_SUCCESS_REBOOT_REQUIRED
if( $msiProcess.ExitCode -in 0, 3010 ) {
    Write-Host "Installation succeeded with exit code $($msiProcess.ExitCode)"
}

CodePudding user response:

Try passing silent switches (/qn! or /qb!) instead of /passive flag.

  • Related