0

I have a powershell script that I'm attempting to execute over SSH. The command works perfectly when I run it from the server's powershell commandline.

Here is my Powershell script:

ImportSystemModules

$vms = Get-ClusterResource | Where-Object{$_.ResourceType -like "Virtual Machine"}

foreach ($vm in $vms)
{
    if ($vm -eq "Virtual Machine server-name")
    {
        Echo "Stop $vm"
        Stop-ClusterGroup $vm.OwnerGroup
    }
}

Here is the command that I am executing:

C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe -file "C:\Scripts\VMShutDown.ps1"

However, when I run this from a remote machine (Ubuntu 12.04). I get the following error:

Get-ClusterResource : The term 'Get-ClusterResource' is not recognized as the

name of a cmdlet, function, script file, or operable program. Check the

spelling of the name, or if a path was included, verify that the path is

correct and try again.

Any thoughts to what I might be doing wrong?

Operating Systems:

Windows Server 2012 Standard - 64 Bit Operating System

Ubuntu 12.04.4 LTS

CodeLikeBeaker
  • 101
  • 1
  • 4
  • Check the users' PATH variable. Make sure it matches the same path displayed when logged on locally. – Lars Aug 01 '14 at 19:27
  • The first thought that comes to mind is that the relevant module might not be getting loaded when you're executing over SSH. Does `import-module failoverclusters` before the `Get-ClusterResource` cmdlet solve your woes? – HopelessN00b Aug 01 '14 at 19:43
  • Interesting, when I do the import-module failoverclusters, I get a no valid module file was found in any module directory. This also works local to the machine. – CodeLikeBeaker Aug 01 '14 at 19:47

1 Answers1

0

Problem:

Remote power shell executes 32 bit power shell, even on a 64 bit machine. This causes issues loading modules that are only installed and able to be executed using 64 bit process (Failover Clustering for example)

Solution: Create a 64 bit wrapper and execution process.

I created a .bat file which executed the ps1 script from the command line:

powershell.exe -file "C:\{path}\{first-file}.ps1"

Inside this script, you have to create an alias to point to the native 64 bit executable for powershell:

Set-Alias ps64 "$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe"

Once you do this, you can execute another file from within this file:

ps64 {C:\{path}\{second-file}.ps1}

Here, it will load all the proper modules, and execute your 64 bit script.

After doing that, I was able to execute my PS command from Linux and it worked like a charm.

Reference to solution:

http://karlprosser.com/coder/2011/11/04/calling-powershell-64bit-from-32bit-and-visa-versa/

CodeLikeBeaker
  • 101
  • 1
  • 4