Perl Code Samples for use in Application Installation

W
Document Sample
scope of work template
							                    Perl Code Samples
                         for use in
                   Application Installation




By Bryan A. Thompson
Last Updated 2/26/2003
Typical Install Script written in Perl
       use Win32::Registry;

       # Note - for reference, this is line 3


       # Do not edit anything above this line-----------------------------------------------------------------------



       # Change the reference to "ftp" in line 15 to the directory where your product is to be stored on the local drive. This must be a
       subdirectory of the C:\Source Files directory for file permissions to be correct.
       # Change the reference to "wsle_450" in line 16 to the name of your MSI file. Do not enter the file extension (the ".msi" part of
       this filename).

       $msidir="ftp";
       $msiname="wsle_450";



       # Do not change anything below this line--------------------------------------------------------------------


       # Note: This part determines the current directory (where update.pl is located)
       # This allows the script and MSI to be moved from location to location w ithout editing the script
       $cwd=$0;
       @cwd=split(/\\/,$cwd,-1);
       $#cwd=$#cwd-1;
       $cwd=join("\\",@cwd);



       # Note: This changes the current directory to the C: drive.
       chdir ("c: \\");



       # Note: This part adds the following information to the install log.
       print"******************************\n";
       print"Installing Custom Application $msiname.msi \n";
       print"******************************\n";
       print "\n";
       print " ********************\n";
       print " Copying Source Files\n";
       print " ********************\n";
       print "\n";



       # Note - this part deletes any old MSI that may reside in this location. Then it creates or recreates the directory on the local
       drive where the MSI file is kept so that the app can self-repair even when detached from the network. Then the MSI file is copied
       to the new location.
       $sourcefilesdir="C:\\Source Files\\$msidir";
       system("rmdir \"$sourcefilesdir\" /s /q");
       system("mkdir \"$sourcefilesdir\"");
       system("xcopy \"$cwd\\*.msi\" \"$sourcefilesdir\"");



       # Note - this part adds more info to the install log files
       print " **************\n";
       print " Installing MSI\n";
       print " **************\n";



       # This part install the MSI file from the C:\Source Files\<whatever> directory
       $sourcefilesmsi="$sourcefilesdir\\$msiname.msi";
       $logfile='C:\winnt\system32\umrinst\applogs\\'."$msiname.txt";
       $msiproperties='ALLUSERS="1" COMPANYNAME="UMR" USERNAME="UMR" ROOTDRIVE="C:\"';
       system("msiexec /qn /i \"$sourcefilesmsi\" /l* \"$logfile\" $msiproperties");



       # Note - This part creates the product key required for AFS/ADS login scripts to run
       $productlistkey="SOFTWARE\\UMR\\INSTALL\\Product_List";
       $productkey="msi_$msiname";
       $HKEY_LOCAL_MACHINE->Open("$productlistkey",$hkey);
       if ($hkey)
       {
        $hkey->Create($productkey,$skey);
        $skey->Close();
        $hkey->Close();
       }
Additional Code Samples


      Adding Files, Directories and Shortcuts

              Adding Files:

                       The following code can be used to copy all files in a directory to a local drive:
                                  system("xcopy /Q \"$cwd\\*.*\" \"C:\\Source Files\\mcafee451\"");


                       The above script will not work if the directory contains an Oldfiles directory. If
                       this situation arises, copy the files to a subdirectory, then run the above script.
                       An alternative is using the copy command instead of the xcopy command.



              Adding Shortcuts:

                       Since shortcuts are files, this is similar to adding a file. Create the shortcut file
                       on a test machine. Then follow the procedure above to copy the file through the
                       install script.


              Adding Directories:

                       system ('mkdir C:\temp');




      Deleting Files, Directories and Shortcuts

              Deleting Files and Shortcuts:

                       This code will check to see if the file specified in the $file_to_delete variable
                       exists, and if it does, the script will delete that file. Since shortcuts are files, this
                       will work for shortcuts, too:

                                  $file_to_delete='C:\Documents and Settings\all users\desktop\Acrobat Reader 4.0.lnk';
                                  if (-f $file_to_delete)
                                  {
                                   system("del \"$file_to_delete\"");
                                  }




              Deleting Directories:

                       This code will delete the directory C:\UMRINST and any subdirectories, and
                       will suppress any system prompts:

                                  system ('rmdir /s /q "C:\umrinst\"');




      Moving Files and Directories

              This will move the contents of the folder C:\ UMRINST\ Boot to the folder
              C:\WINNT\SYSTEM32\ UMRINST:

                       system ('move /y "C: \umrinst\boot" "C:\winnt\system32\umrinst"');
Changing File Permissions

        Some products require certain file permissions to be changed in order to allow the
        product to work correctly for users who are not administrators or power users. The
        following code changes permissions on the folder C:\Program Files\AutoCAD 2002 to
        give the group “everyone” full access to this directory and all subdirectories:
                 system ("echo y|cacls.exe \"c:\\Program Files\\AutoCAD 2002\" /t /c /e /g everyone:f >NUL");




Changing File Attributes

        This code changes the file attributes on the file C:\hiberfile.sys:

                 system ('attrib -r -s -h c:\hiberfil.sys');
Conditional Installation

        Some products depend on other products being installed. In this case, an application
        script that depends on Oracle checks the registry to see if Oracle client has been installed,
        and fails to execute if it hasn’t:

                 $oracle_installed=0;

                 $reg="Software \\UMR\\INSTALL\\Product_List\\msi_Oracle8i";
                 $HKEY_LOCAL_MACHINE->Open($reg,$hkey);
                 if ( $hkey )
                 {
                  $oracle_installed=1;
                  $hkey->Close();
                 }

                 $reg="Software \\UMR\\INSTALL\\Product_List\\msi_Oracle9i";
                 $HKEY_LOCAL_MACHINE->Open($reg,$hkey);
                 if ( $hkey )
                 {
                  $oracle_installed=1;
                  $hkey->Close();
                 }

                 if ($oracle_installed eq 1)
                 {
                 #Insert Code to be installed if the
                 } else {
                 print "\nThis installation failed because the Oracle client has not been\n";
                 print "installed.\n";
                 }


        This code will check to see if a machine is a CLC install, and if so, run the application
        install script:

                 $HKEY_LOCAL_MACHINE->Open($Register,$hkey)|| die $!;
                 $hkey->GetKeys(\@key_list) ;

                 foreach $key (@key_list)
                       {
                        if ($key eq "clc") {
                           #Insert code to install product here
                        }
                       }
                 $hkey->Close();
Registry Modifications

        Adding Keys

                The simplest way to do this is to make the changes to the registry manually on a
                test machine, then export that key using the export feature of regedit. Save the
                file with the .reg extension. The contents of the reg file will appear as shown
                below:

                         Windows Registry Editor Version 5.00

                         [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system]
                         "dontdisplaylastusername"=dword:00000001

                         [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
                         "ShowLogonOptions"=dword:00000000




                To install this .reg file, use the following command in the application install
                script. This command adds the contents of the .reg file to the system registry,
                overwriting anything that might already be in the locations specified in the .reg
                file:
                         system ('regedit /s c: \winnt\system32\umrinst\whatever.reg');




                It’s also possible to add a registry key using Perl directly. This method doesn’t
                require that a .reg file be created first:
                         $productkey="msi_visual_studio_7";

                         $HKEY_LOCAL_MACHINE->Open("$productlistkey",$hkey);
                         if ($hkey)
                         {
                          $hkey->Create($productkey,$skey);
                          $skey->Close();
                          $hkey->Close();
                         }
Registry Modifications (continued)

        Changing Registry Permissions

                This code modifies a list of registry permissions for the keys associated with
                AutoCAD:
                         # Grants Everyone full access to Autocad registry keys and files

                         use Win32::Registry;

                         $prefix="\\Registry \\Machine";
                         # 1 Administrators full
                         # 5 Creator full
                         # 7 World full
                         # 17 System Full
                         $perms="[1 5 7 17]";
                         $tempfile='c: \temp\t_perms.ini';
                         @regkeys=(
                          'SOFTWARE\Classes\AutoCAD.Drawing',
                          'SOFTWARE\Classes\AutoCAD.Drawing.15',
                          'SOFTWARE\Classes\CLSID\{83836783-4E7A-11D3-8300-0060B0EF5B11}',
                          'SOFTWARE\Classes\CLSID\{8E75D913-3D21-11d2-85C4-080009A0C626}',
                          'SOFTWARE\Autodesk',
                         );

                         sub find_keys
                         # Sends all subkeys (inclusive) of passed parameter to OUTFIL in specified format
                         {
                          my($hkey);
                          my($regkey);
                          my($i);
                          my(@key_list);
                          ($regkey)=@_;

                          $HKEY_LOCAL_MACHINE->Open($regkey,$hkey);
                          # Some keys may be unopenable; do not include these
                          if ($hkey)
                          {
                           unless ("$prefix\\$regkey" =~ /=/)
                           # regini has problems with the char '=' in key names
                           {
                            print OUTFIL "$prefix\\$regkey $perms\n";
                            $hkey->GetKeys( \@key_list);
                            $hkey->Close();
                            for ($i=0;$i<@key_list;$i++)
                            {
                             find_keys($regkey."\\".$key_list[$i]);
                            }
                           }
                          }
                         }
Changing the System Path and other Environment Variables

       This code adds a directory to the end of the System Path environment variable:
               # Add a directory to the end of the Machine Path

               use Win32::Registry;

               $path_to_add='C:\Program Files\Common Files\macromedia';
               $environmentkey='System\CurrentControlSet\Control\Session Manager\Environment';
               $pathvalue='path';

               $HKEY_LOCAL_MACHINE->Open("$environmentkey",$hkey);
               if ($hkey)
               {
                $hkey->GetValues( \%values);
                foreach $value (keys %values)
                {
                 if (uc $value eq uc $pathvalue)
                 {
                  $oldpath=$values{$value}->[2];
                  $newpath="$oldpath;$path_to_add";

                  print "Adding path to Local Machine Path environment variable\n";
                  undef $undefined;
                  $hkey->SetValueEx($value,$undefined,REG_EXPAND_SZ,$newpath);
                 }
                }
                $hkey->Close();
               }
               else
               {
                print "Could not open environment.\n";
               }




Changing Local Groups on NT/2000/XP

       The Local groups for administrators, power users and remote desktop users should be
       changed through the NT Groups tool located here:

               https://ccadm.umr.edu/auth-cgi-bin/cgiwrap/ccapps/desktop/ntgroup-edit.pl



       Sometimes it becomes necessary to add “everyone” to a group to allow an application to
       function:
               system ('net localgroup "Debugger Users" everyone /add');
Changing Windows Service Startup Characteristics

       This involves editing a registry key in each case, then rebooting. It is necessary to know
       the name of the service.

       1)   Go to the Windows/Control Panel/Services dialog (located in different locations for
            different OSes).




       2)   Find the service you wish to start or stop, and double-click it.




       The service name is shown as “AvSynMgr”.
       3)   To Disable a service at boot (nothing can start this service, even manually), copy
            this text into a .reg file:
                REGEDIT4

                [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AvSynMgr]
                "Start"=dword:00000004




       4)   To Start a Service at boot, copy this text into a .reg file:
                REGEDIT4

                [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AvSynMgr]
                "Start"=dword:00000002




       5)   To set the service to manual at boot (not started, but can be started manually or by
            another process), copy this text into a .reg file:

                REGEDIT4

                [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AvSynMgr]
                "Start"=dword:00000002




       To install this .reg file, use the following command in the application install script. This
       command adds the contents of the .reg file to the system registry, overwriting anything
       that might already be in the locations specified in the .reg file:
                system ('regedit /s c: \winnt\system32\umrinst\whatever.reg');




Starting and Stopping Windows Services

       Sometimes it is necessary to stop an application before it can be updated. The follo wing
       code will stop a service, execute a script, then start the service again:

                system ("net stop avsynmgr");

                # Insert script to be run while service is stopped here

                system ("net start avsynmgr");

						
Related docs