Search code examples
powershellscheduled-taskspowercli

Powershell as scheduled task issue with importing module, it seems


I am attempting to configure some powershell/view powercli scripts for our VMware horizon environment. I have a powershell script that works properly to query the horizon instance and check machine states. However, when I try to run this as a scheduled task using a service account, it seems to fail to import a module, as a command is unrecognized ("The term 'Connect-HVServer' is not recognized as the name of a cmdlet, function, script file, or operable program.")

I tried profiles as well, didn't matter.

What I observed is that if I open powershell as the user in question (run as different user > authenticate as service account), leaving that powershell instance open will allow the scheduled task to run as expected. However, if i close the powershell instance, the scheduled task fails. This is obviously not viable since the goal is for this script to run on a schedule without the service account (or any account) being logged into the windows server at the time the powershell script gets run.


Solution

  • The problem you're running into is environment variables. In the course of running as a user versus running as machine, the PSModulePath environment variable changes to include user-directories for user-scoped module installs. You should install PowerCLI machine-wide.

    Alternatives (these assume your service account has admin privileges):

    • Modify your $Env:PSModulePath in the script to include each user's module path
    • Specify the path in an Import-Module statement in your script before you use any of the cmdlets

    Example of the first alternative:

    foreach ($user in (Get-ChildItem -Path C:\Users)) {
        $Env:PSModulePath += ";$($user.FullName)\Documents\WindowsPowerShell\Modules"
    }
    

    Example of the second:

    Import-Module -Name 'C:\Users\KnownUser\Documents\WindowsPowerShell\Modules\PowerCLI'