PowerShell: Start all VMWare services, self elevate to admin

For reasons, all my VMWare services are set to manual startup.  I like it this way.

I wanted an easy way to start all the services so naturally, a PowerShell script was required.  However the services can’t be started by PowerShell without elevated privileges, and I usually work in a non-elevated ISE.  So this version of the script self-elevates, saving me precious seconds.

# Start All VMware services V2
# WARNING - THIS SCRIPT WILL ATTEMPT TO ELEVATE ITSELF

# Check if the current user role is in the local computer administrator role

            # get-service -displayname 'VMware*' | %{Stop-Service -name $_.Name}

If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
    [Security.Principal.WindowsBuiltInRole] "Administrator")){
               
               # Not running as administrator

                # Create a new process object that starts PowerShell
                   $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";
   
                   # Specify the current script path and name as a parameter
                   $script:MyInvocation.MyCommand.Path
                   $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"
   
                   # Indicate that the process should be elevated
                   $newProcess.Verb = "runas";
   
                   # Start the new process
                   [System.Diagnostics.Process]::Start($newProcess);
   
            }
               
        Else
        {     
 
        # Elevated Code - will only run if IS Administrator 
            
            # Set some colors so its clear what is going on
            
                $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
                $Host.UI.RawUI.BackgroundColor = "DarkRed"
                clear-host

            # start all the VMware services
            
                $s = get-service -displayname 'VMware*' # i should really list the services in the right startup order
                write-host $s

                    foreach ($svc in $s){

                        write-host $svc.name 'is' $svc.Status
                      
                        if($svc.Status -ne "Running")
                        {
                            write-host 'Starting: ' $svc.Name
                                #Stop-Service $svc.name
                                #set-service $svc.Name -StartupType Manual
                            Start-Service $svc.Name

                        }
                        Else{
                             # Do something else if you want
                        }
                    }


                #start "C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe"      
                    }

 # Re-present the services again

     get-service -displayname 'VMware*'
     
        Write-Host "Sleeping 60" 
        start-sleep -seconds 60

 

 

 

PowerShell: DVD copy automation script V2.0

Requirement

I have a bunch of DVD’s that I want to archive to hard-disk so I can dispose of the DVDs.

Automate the process as much as possible.

Note: This is not a DVD copy protection crack, the DVD’s have to be copyable by the OS.

Synopsis

This script will wait for the DVD volume name to be NOT NULL

When a DVD is inserted, the script automatically creates a new folder in the destination root path, using the DVD name as the destination folder name.

After completing the copy it ejects the DVD drive and loops back into the waiting state.

Features

  • Disk insertion detection (not based on auto-run)
  • Destination folder name duplication protection via folder-name suffix (this prevents DVDs of the same name overwriting each-other)
  • Simple copy integrity check using source and destination length comparison
  • Speech so I can hear it from the next room when the DVD needs to be changed out

To Do

I’m wondering if using [System.IO.StreamWriter would be faster, but I think the bottleneck would be in the DVD Read, not the disk write.  Speculation only.  Next time I use the script I’ll make that modification and see how it goes.

Disclaimer

My scripts are open source, free to use, come with neither warranty as to optimal performance nor suggestion that they are necessarily the best way to achieve anything.

<# DVD Copy Script V 2.0
 
     This version speaks so I can hear it from the next room when it needs a new disk

 SYNOPSIS ----------------------------------------------------------------------

     I have a bunch of DVD's that I want to archive to Hard Disk so I can dispose of the DVDs
     I want to automate it as much as possible.

     This script will wait for the DVD volumename to be not null
     When a DVD is inserted it automatically copies the DVD to a destination folder root
      using the DVD name as a new destination sub-folder
 
     After completing it pops open the dvd drive and loops back into waiting for disk mode
 
     This version uses speach so I can hear it from another room!

 FEATURES ---------------------------------------------------------------------

    * Speach
    * Destination folder name duplication protection
    * Simple copy integrity check using length

 #>

# INCLUDES ----------------------------------------------------------------------

    # add speach object

    Add-Type -AssemblyName System.speech
    $speak = New-Object System.Speech.Synthesis.SpeechSynthesizer

# FUNCTIONS --------------------------------------------------------------------- 


    function popdisk(){
        (new-object -COM Shell.Application).NameSpace(17).ParseName($dvdpath).InvokeVerb('Eject')
        }

    function testpath($tpath){
          
              if ((test-path $tpath) -ne $true) {
              $speak.Speak('path does not exist ... all is done here"')
              return $tpath
              }
          
              else{
                   $speak.Speak('path exists, adding suffix and retesting') 
                    $tpath += "_1"
                    $speak.Speak("new foldername is "+ $tpath)
                     testpath "$tpath"
                 }
              }

    function CopyDVD{

    # Drives and Paths (omit \)
        $dvdpath = 'I:' #no slash
        $destpath = 'E:\DVDCOPY' #no slash


        While($true){

            #Clear variables
            $volumename = $null
            $foldername = ""
            $drive =""

            $speak.Speak('Waiting for disk')
            "  Waiting for disk ... " | Out-Host

            #loop while disk volumename is null
            DO{
            $drive = Get-WmiObject -Class Win32_CDROMDrive
            $volumename = $drive.volumename
            }while ($volumename -eq $null)

            #disk detected get source details
            
                $speak.Speak('Disk detected, obtaining details.')
                $foldername = $volumename.ToString()
            
                #Check for duplicate folder and suffix number if folder exists

                $speak.Speak('Disk name is ' + $volumename.ToString())
                $source = Get-ChildItem "$dvdpath\VIDEO_TS\" -recurse | Measure-Object -Property length -Sum 
                $sourceLength = $source.Sum
                start-sleep -seconds 10
                $speak.Speak('Copying Disk.')
                "  Copying disk " + $foldername | Out-Host
                "   src len " + $sourceLength | Out-Host
            
            
                $speak.Speak('checking if destination path is already used ' + $volumename.ToString())
                $validpath=(testpath "$destpath\$foldername")
            


                copy-item "$dvdpath\VIDEO_TS\" "$validpath\VIDEO_TS\" -Recurse -Force 
        
            #get destination length 
                $destChilds = Get-ChildItem "$validpath\VIDEO_TS\" | Measure-Object -Property length -Sum 
                $speak.Speak('Checking destination integrity')
                $destLength = $destChilds.Sum
                "   dst len " + $destLength | Out-Host

            if ($sourceLength -ne $destLength){
            
                "   Error! " | Out-Host
                $speak.Speak('ERROR ERROR ERROR ERROR ERROR')

                exit
            }
                Else{
                    "ok" | out-host
                }


            start-sleep -Seconds 10

            $speak.Speak('Hello   the D--V-D has finished!')
            $speak.Speak('Hello   the D-V-D has finished!')

            "  Finished " + $foldername | Out-Host

            # Eject CD
                popdisk


            start-sleep -Seconds 10

            #end of while
            }

    #end of function
    }

# MAIN ----------------------------------------------------------------------

"--------------- starting DVD Auto Copy" | Out-Host

    popdisk

while ($true){

 copyDVD

 }

 

Open Sourcing – all my code is belong to you!

Version 0.1

<# 
SYNOPSIS: In the spirit of sharing that enabled me to learn how to code, I am now open sourcing all of my code, that it may be of some use to others.  Enjoy!

TO DO: I'd like to get around to describing all of the problems each solution solved for, but for now its just a minimalist dump.
 
#>

 

I first learned to code in ZX Spectrum BASIC at around the age of 10.  It was 1986.  More accurately, I learned to type and eventually understand the code from various ‘program your own games’ books and ‘Sinclair User’ magazine articles.

It was a little later that I actually achieved an understanding of the primitive building blocks of the code.

Quite possibly my young brain was prepped for the logic and structure of programming through my obsession with the essentially ‘if-then-else’ based Fighting Fantasy series of ‘choose your own adventure’ game books.

‘The Warlock of Firetop Mountain’ was the first I remember owning, and I believe the first in the series. They were awesome.  My very early unguided ventures into coding my own programs were literally codifications of these simple narratives.

I, like many people, have learned a lot of what I know about coding from commercially driven ‘pay for knowledge’ sources such as at university, training courses, and books. However, I am just old enough to claim some memory of the relatively early years of open source code sharing.

So, like everybody, I have also learned a stack from the open source information made available by the generosity, or naivety, nevertheless sheer enjoyment of sharing through magazines, blogs,  websites, friends and various other mediums.

So, I have decided to dig up and throw into the pot of shared online code, a bunch of my own work; better or poorer to be debated, but certainly useful.

Note: I don’t claim that any of this code still works, nor either that that which does, is optimal for the task.  Much of it is old, some of it is new, the context and constraints of the environment it was written for are here absent, but it all served a purpose.