Blogs

How To Choose A Packaging Solution

iWqBbQ.jpegApplication packaging is defined here as the creation of a deployment package. This could mean repackaging a vendor provided setup in order to create a customized silent deployment. However, it could also mean wrapping a package in a virtual layer for distribution purposes. One thing all application packaging products (and application packaging features) provide, is a means to create a deployment package intended for internal corporate distribution. Most packaging projects are centered around the deployment of new systems or operating systems. However, depending on the organization, packaging could be something that takes several months to complete, or it can be an ongoing task as new and updated applications may be regularly required.

Some vendors will try to differentiate and put their own spin on certain features to stand out. Other vendors may offer the bare minimum to address the need. Therefore, it is clearly not enough to “check the box” when it comes to making your product selection. However, it is a great exercise to consider the features and functions you really care about so you can focus on those and avoid being distracted by capabilities you don’t care about. Once the tools you should consider have been paired down to just a couple products based on features, ease of use, support, cost, etc. then will be the time to compare who does a better job when it comes to the aspects of the solution that really matter to you.

AppDetails offers free help worth exploiting. Make your list of features you care about, then prioritize them. Along with your budget, this prioritized list of features will allow AppDetails to use it’s deep knowledge of the market to help you identify a couple of products for consideration. It’s always nice to have two, or maybe three, choices for consideration so you can focus on them, watch videos, play with demos, and confirm your choice as the solution that best meets the needs of your organization.

Here you will find links to a list of features that may exist for any given Repackaging solution. Start digging through and building the list of features you care about most. Perhaps they all sound great? That’s where prioritizing the list gets valuable. Once you have a list of features you are after, send it to AppDetails to match your interests with the best candidates. 

View comments (1)

Alvato install issue - [MsiNetAssemblySupport] in msi for MS DOTNet framwework will not work - especially with version 4.0.30319

Altova Installation issues (Especially on Windows 10 with Microsoft Dot Net framework 10 installed)
Altova was failing to install because of a built-in custom actions that are trying to register the dll using regasm. On a Windows 10 machine, this should not have gone through testing (esp with DotNET framework version v4.0.30319 installed).
 
This specific property, [MsiNetAssemblySupport] in the custom action, will provide the msi installer with the latest version of Dot Net framework installed by looking at the file version for fusion.dll (usually located in C:\Windows\Microsoft.NET\Framewrok\v4.0.30319.

Unfortunately, Microsoft seemed to have put the file version higher than the framework version and causing issues if this specific version is installed. In this case, the file version is higher and when we put that version in the path, REGASM is never present. That is why the path is being errored when installing the msi


As a workaround, I have disabled the custom actions (during install and uninstall) and registering the dll manually. This may comeup again with other applications and letting you know so you are aware of it.
Be the first to comment

Change the KBE keyboard layout

In order to use a keyboard layout for a different language, there are steps that can be taken to make this easy.
First identify the language ID from the this page: For IDs of other languages, see: https://msdn.microsoft.com/en-us/library/cc233982.aspx
According to [https://technet.microsoft.com/en-us/library/cc765969%28v=ws.10%29.aspx] boot into a kbe and go to command prompt

Substitute the language ID found from the step above for your usage, this example looks at French, which had the language ID code of 0x040c
Type 'wpeutil listkeboardlayouts 0x040c’ at the command prompt
The list is long, so you may want to output to a file because the buffer isn’t big enough to let you scroll all the way back to the beginning.
'wpeutil listkeboardlayouts 0x040c > t:\petemp\idcode.txt'

Then scroll through this file and find the name of the keyboard layout you want to use.  For example Belgian French is 040c:0000080c

So then you would type in 'wpeutil setkeyboardlayout 040c:0000080c’

This does not work in the initial command window from which it was run, but does work in other command windows and works in the dialog box for getcomputername.exe!!

So a user could run KBEM and type 'wpeutil setkeyboardlayout 040c:0000080c’ as a command line option, or a preinstall bat task could be used containing the identical information.

*Warning, after the change is made, the keyboard layout does not affect the K2000 Deployment HTA pages.
Be the first to comment

app info for checking

For copying files from one location to another location using robocopy

Filecopy.vbs


On Error Resume Next
Set oShell=WScript.CreateObject("WScript.Shell")
Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")

oShell.Run("robocopy" & " " & Chr(34) & "%LocalAppdata%\Microsoft\AppV\Client\Integration\PKGID\Root\VFS\ProgramFilesX86\Foldername" &

Chr(34) & " " & Chr(34) & "%LocalAppdata%\Microsoft\AppV\Client\VFS\PKGID\APPV_ROOT\Foldername" & Chr(34) & " " & "/e /R:1 /W:2")

oShell.Run("robocopy" & " " & Chr(34) & "%LocalAppdata%\Microsoft\AppV\Client\Integration\PKGID\Root\VFS\ProgramFilesX86\Foldername

\shortfolder" & Chr(34) & " " & Chr(34) & "%AppData%\shortfolder" & Chr(34) & " " & "/e /R:1 /W:2")

oshell.Run("Powershell.exe -noexit %LocalAppdata%\Microsoft\AppV\Client\Integration\PKGID\Scripts\Shortcut.ps1")



<appv:UserScripts>
  <appv:StartVirtualEnvironment RunInVirtualEnvironment="true">
   <appv:Path>POWERSHELL.EXE</appv:Path>
   <appv:Arguments>-ExecutionPolicy RemoteSigned -File "[{AppVPackageRoot}]\..\Scripts\HKCU.ps1"</appv:Arguments>
   <appv:Wait RollbackOnError="false" />
  </appv:StartVirtualEnvironment>
  <appv:PublishPackage>
   <appv:Path>WSCRIPT.EXE</appv:Path>
   <appv:Arguments>"[{AppVPackageRoot}]\..\Scripts\Filecopy.vbs"</appv:Arguments>
   <appv:Wait RollbackOnError="false" />
  </appv:PublishPackage>
  <appv:UnpublishPackage>
   <appv:Path>POWERSHELL.EXE</appv:Path>
   <appv:Arguments>-ExecutionPolicy RemoteSigned -File "[{AppVPackageRoot}]\..\Scripts\RDDir.ps1"</appv:Arguments>
   <appv:Wait RollbackOnError="false" />
  </appv:UnpublishPackage>
 </appv:UserScripts>


HKCU.ps1

$Server1 = Get-itemproperty "HKCU:\Software\KeyName"
$var1 = $Server1."valuename"
$var1 = $var1.ToLower()

$FINALVALUE = "Final"
$TESTVALUE = "TEST"

$regpath2 = "HKCU:\Software\KeyName1"

if (($var1 -eq "test") -or ($var1 -eq "test1") -or ($var1 -eq "test2") -or ($var1 -eq "test3") -or ($var1 -eq "test4")) {
Set-ItemProperty -path $regpath2 -Name "CurrentEnvironment" -Value "$TESTVALUE" -Force
}
else {
Set-ItemProperty -path $regpath2 -Name "CurrentEnvironment" -Value "$FINALVALUE
}

$HD = $ENV:HDRIVE

if(-not (Test-Path "$HD\Documents\TEstKey")){
            New-Item -Path "$HD\Documents\TEstKey" -ItemType directory -Force
}
if(-not (Test-Path "$HD\TEstKey")){
            New-Item -Path "$HD\TEstKey" -ItemType directory -Force
}
if(-not (Test-Path "$HD\Testkey1")){
            New-Item -Path "$HD\Testkey1" -ItemType directory -Force
}

RDDir.ps1
$scriptpath= $MyInvocation.MyCommand.Path
$dir =Split-path $scriptpath

$Hname= $env:APPDATA
$Reg1 = $Hname+= "\Microsoft\Windows\Start Menu\Programs\shortname.lnk"
Remove-Item -path $Reg1 -Recurse


---------------------------------------


 <appv:UserScripts>
    <appv:StartVirtualEnvironment>
      <appv:Path>WSCRIPT.EXE</appv:Path>
      <appv:Arguments>"[{AppVPackageRoot}]\Addin_Install.vbs"</appv:Arguments>
      <appv:Wait RollbackOnError="false" />
    </appv:StartVirtualEnvironment>
    <appv:UnpublishPackage>
      <appv:Path>POWERSHELL.EXE</appv:Path>
      <appv:Arguments>-ExecutionPolicy RemoteSigned -windowStyle Hidden -File "[{AppVPackageRoot}]\..\Scripts

\DelAddin.ps1"</appv:Arguments>
      <appv:Wait RollbackOnError="false" />
    </appv:UnpublishPackage>

Executable.ps1

$dir = Split-Path $script:MyInvocation.MyCommand.Path

$REG = $dir += "\MainExe.exe"


&$REG

permission.ps1

$curdir = $PSScriptRoot

$parent0 = $curdir

$parent1 = (Get-Item $parent0).Parent.FullName

$root = $parent1 + "\Root\config"

$arg0 = $root + " /grant Users:(OI)(CI)F"

Start ICACLS.EXE -ArgumentList $arg0


----------------------------------------------


    <UserScripts>
      <PublishPackage>
        <Path>POWERSHELL.EXE</Path>
        <Arguments>-ExecutionPolicy RemoteSigned -File "[{AppVPackageRoot}]\..\Scripts\Shortcutcreation.ps1"</Arguments>
        <Wait RollbackOnError="false" />
      </PublishPackage>
      <UnpublishPackage>
        <Path>POWERSHELL.EXE</Path>
        <Arguments>-ExecutionPolicy RemoteSigned -File "[{AppVPackageRoot}]\..\Scripts\Removefolder.ps1"</Arguments>
        <Wait RollbackOnError="false" />
      </UnpublishPackage>
    </UserScripts>
  </UserConfiguration>
  <!-- Machine Wide Configuration -->
  <MachineConfiguration>
    <!-- Product Source URL Section -->
  
    <Subsystems>
      <!-- Machine Wide Virtual Registry Section -->
      <Registry />
    </Subsystems>
    <!-- Machine Scripts Section -->
    <MachineScripts>
      <AddPackage>
        <Path>POWERSHELL.EXE</Path>
        <Arguments>-ExecutionPolicy RemoteSigned -File "[{ProgramFilesX86}]\Mainfolder\makelink.ps1"</Arguments>
        <Wait RollbackOnError="false" />
      </AddPackage>


makelink.ps1 (keep the script from where u want to create as link)
$curdir = $PSScriptRoot
$parent = $curdir
do
{
  $parent = (Get-Item $parent).Parent.FullName
 
}
while (($parent.EndsWith("Root")) -eq $false)


Start-sleep 3

$cmdline = " /C mklink /D " + "$env:ProgramData\DummyFoldername" + ' "' + $curdir + '"'

Start CMD.exe -ArgumentList $cmdline


shortcutcreation.ps1

$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath
$arg1 = Split-Path -Path $dir -Parent
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$HName = $env:APPDATA
$HName3 = $env:APPDATA


$REG1 = $HNAME+="\Microsoft\Windows\Start Menu\Programs\Shortcut Main folder name"
$REG4 = $HNAME3+="\Microsoft\Windows\Start Menu\Programs\Shortcut Main folder name\Subfolder"


$arg3 = "$dir\Shortcut name.lnk"
$arg4 = "$dir\2nd shrotcut name.lnk"


# creating shortcut folders


New-Item $REG1 -type directory
New-Item $REG4 -type directory


#Copying Shortcut Files
Copy-Item -Path $arg3 -Destination $REG1 -Recurse -Force
Copy-Item -Path $arg4 -Destination $REG4 -Recurse -Force


Be the first to comment

Remote Management of Software on Network Computers

Hi all,
I work in a College environment with a large number of computers in classrooms. I always thought it would be handy to have a script to remotely gpupdate a specific room of computers after linking up new GPO software to a room. I've managed to write the first script below which will work in a .bat file. You'll also need the psexec.exe file from https://technet.microsoft.com/en-us/sysinternals/pxexec.aspx. It may not be smartly or cleanly written but it works for me and I'm happy with it. Feel free to make modification as you see fit. I have it saved on my network drive so that's why it points to M:\Programs\Program. I enter the first part of our room name which is typically SiteName-RoomNumber and then the number of computers in the room. I have an extra '-' hard coded in. It then run a gpupdate against each pc in the room with a second pause between each.

The second script at the bottom is a powershell so will need saved as .ps1 and it can remotely delete GPO's based on partial entry of the GPO name. Be aware it deletes any software GPO that matches the search phrase, so it may delete more than you expect. Hands up to the fact that it is probably not that well written but it works for me and I'm happy that it works for me.

The powershell code I've copied from the internet but have managed to work it to what I wanted it to do, so it's not solely my own doing. Any comments welcome and again, free free to ignore, edit, rewrite, etc.

*******************************
Batch File Below
*******************************
@echo off
"M:\Programs\Program\PsExec.exe" /accepteula
:Start
c:
cls
Echo GPUPDATE or Reboot Computers
echo.
Echo 1. GPUPDATE Computers
Echo 2. Reboot Computers
Echo 3. Log Off Computers
echo 4. Shutdown Computers
echo 5. Exit
echo.
CHOICE /C 123456 /M "Enter your choice: "

:: Note - list ERRORLEVELS in decreasing order
IF ERRORLEVEL 5 GOTO End
IF ERRORLEVEL 4 GOTO SRoom
IF ERRORLEVEL 3 GOTO LRoom
IF ERRORLEVEL 2 GOTO RRoom
IF ERRORLEVEL 1 GOTO GRoom

:SRoom
cls
Echo Shutdown Computers
Echo.
set /a i=1
set /p STE=Site and Room Number: 
set /p NUM=Number of Computers: 

:Sloop
cls
echo %STE%-0%i%
echo.
shutdown /f /s /t 0 /m \\%STE%-0%i%
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Sloop3
SET /a i=%i%+1
if %i%==10 GOTO SLOOP2
GOTO Sloop

:Sloop2
echo %STE%-%i%
echo.
shutdown /f /s /t 0 /m \\%STE%-%i%
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Sloop3
SET /a i=%i%+1
GOTO SLOOP2

:Sloop3
echo %STE%-staff
echo.
TIMEOUT /T 5 /NOBREAK
shutdown /f /s /t 0 /m \\%STE%-staff
GOTO Menu

:RRoom
cls
Echo Reboot Computers
Echo.
set /a i=1
set /p STE=Site and Room Number: 
set /p NUM=Number of Computers: 

:Rloop
cls
echo %STE%-0%i%
echo.
shutdown /f /r /t 0 /m \\%STE%-0%i%
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Rloop3
SET /a i=%i%+1
if %i%==10 GOTO RLOOP2
GOTO Rloop

:Rloop2
echo %STE%-%i%
echo.
shutdown /f /r /t 0 /m \\%STE%-%i%
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Rloop3
SET /a i=%i%+1
GOTO RLOOP2

:Rloop3
echo %STE%-staff
echo.
TIMEOUT /T 5 /NOBREAK
shutdown /f /r /t 0 /m \\%STE%-staff
GOTO Menu

:groom
cls
Echo GPUPDATE Classroom
Echo.
set /a i=1
set /p STE=Site and Room Number: 
set /p NUM=Number of Computers: 

:Gloop
start "%STE%-0%i%" M:\Programs\Program\PsExec.exe -nobanner \\%STE%-0%i% gpupdate /force /boot
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Gloop3
SET /a i=%i%+1
if %i%==10 GOTO Gloop2
GOTO Gloop

:Gloop2
start "%STE%-%i%" M:\Programs\Program\PsExec.exe -nobanner \\%STE%-%i% gpupdate /force /boot
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Gloop3
SET /a i=%i%+1
GOTO Gloop2

:Gloop3
TIMEOUT /T 5 /NOBREAK
start "%STE%-staff" M:\Programs\Program\PsExec.exe -nobanner \\%STE%-staff gpupdate /force /boot
GOTO Menu

:LRoom
cls
Echo Log Off Computers
Echo.
set /a i=1
set /p STE=Site and Room Number: 
set /p NUM=Number of Computers: 

:Lloop
cls
echo %STE%-0%i%
echo.
logoff /server:%STE%-0%i% 1
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Lloop3
SET /a i=%i%+1
if %i%==10 GOTO LLOOP2
GOTO Lloop

:Lloop2
echo %STE%-%i%
echo.
logoff /server:%STE%-%i% 1
TIMEOUT /T 1 /NOBREAK
IF %i%==%NUM% GOTO Lloop3
SET /a i=%i%+1
GOTO LLOOP2

:Lloop3
echo %STE%-staff
echo.
TIMEOUT /T 5 /NOBREAK
logoff /server:%STE%-staff 1
GOTO Menu

:Menu
If %computername% == %STE%-staff (
goto End
) Else (
GOTO Start

:End
EXIT

**************************
Batch File Above
**************************

*************************
Powershell Below
*************************
Clear-Host
$Search = read-host "Software to delete"
$SiteName = read-host "Site and Room"
$ComNum = read-host "Number of Computers"

For ($i=1; $i -le $ComNum; $i++) {
    if ($i -lt 10) {
        Invoke-Command -ComputerName $SiteName"-0"$i -ScriptBlock {
            param(
                $Search
                )
            $Keys = Get-ChildItem 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Group Policy\AppMgmt'
            $Items = $Keys | Foreach-Object {Get-ItemProperty $_.PsPath }
            foreach ($Item in $Items) {
                if ($Item.'GPO Name' -match $Search) {
                    Remove-Item $Item.PSPath
                    
                }
            }
        }-ArgumentList $Search, $SiteName, $ComNum
        $Computer = $SiteName + "-0" + $i
        Start-Process "c:\windows\system32\cmd.exe" "/c M:\Programs\Program\PsExec.exe \\$Computer gpupdate /force /boot"
                    
    }

    Else {Invoke-Command -ComputerName $SiteName-$i -ScriptBlock {
            param(
                $Search
                )
            $Keys = Get-ChildItem 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Group Policy\AppMgmt'
            $Items = $Keys | Foreach-Object {Get-ItemProperty $_.PsPath }
            foreach ($Item in $Items) {
                if ($Item.'GPO Name' -match $Search) {
                    Remove-Item $Item.PSPath
                }
            }
        }-ArgumentList $Search, $SiteName, $ComNum
        $Computer = $SiteName + "-" + $i
        Start-Process "c:\windows\system32\cmd.exe" "/c M:\Programs\Program\PsExec.exe \\$Computer gpupdate /force /boot"
    }
}

Invoke-Command -ComputerName $SiteName"-staff" -ScriptBlock {
    param(
        $Search
        )
    $Keys = Get-ChildItem 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Group Policy\AppMgmt'
    $Items = $Keys | Foreach-Object {Get-ItemProperty $_.PsPath }
    foreach ($Item in $Items) {
        if ($Item.'GPO Name' -match $Search) {
            Remove-Item $Item.PSPath
        }
    }
}-ArgumentList $Search, $SiteName, $ComNum
$Computer = $SiteName + "-staff"
Start-Process "c:\windows\system32\cmd.exe" "/c M:\Programs\Program\PsExec.exe \\$Computer gpupdate /force /boot"

************************
Powershell Above
************************
Be the first to comment
Showing 11 - 15 of 3077 results