2014-02-21 1 views
0

Я могу запустить скрипт powershell как администратор в powershell, и он дает хороший список запущенных виртуальных машин. Но когда я запускаю его в TaskScheduler с наивысшими привилегиями, он показывает пустой список запущенных виртуальных машин. У нас есть Server 2008 R2, PowerShell V3, и я недавно загрузил модуль Hyper-V для powershell. Я создал учетную запись на сервере с правами администратора, а администраторы имеют полный контроль над всеми каталогами, которые сценарий копирует файлы с/на.Скрипт PowerShell запускается из TaskScheduler, давая пустой массив запущенных виртуальных машин

Кроме того, когда я запускаю скрипт через powershell, мне нужно было работать как администратор. Когда я запускаю его с помощью PowerShell подскажете это то, что он выглядит как:

C: \ Windows \ system32> -NoProfile -noninteractive PowerShell -ExecutionPolicy байпас -command "& C: \ Scripts \ BackupVhdShell_2_param.ps1 -single_backup_file_to_loc«E : \ '-single_backup_file_from_loc' S: \ SQL-bak.vhd '"

Так, что работает от powreshell, чтобы запускать/останавливать vm и копировать файлы.

планировщик задач, это то, как он у меня установлен и он дает пустой список запущенных ВМ:

Run с наивысшими правами проверяется. У меня есть мои учетные данные для входа, чтобы он мог разбудить сервер, когда меня здесь нет, или если он не работает.

В поле Программа/скрипт:% SystemRoot% \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe

В поле Добавить аргументы: -NoProfile -noninteractive -ExecutionPolicy перепускной -command "& с: \ Сценарии \ BackupVhdShell_2_param.ps1 -single_backup_file_to_loc 'E: \' -single_backup_file_from_loc 'S: \ SQL-bak.vhd' "

Любые мысли? Я не уверен, что TaskManager не найдет модуль HyperV? Или, может быть, мне нужен рунас, чтобы он стал администратором? У меня проблемы с поиском информации об этом. Эта ссылка была похожа, но другая: http://ss64.com/nt/runas.html То же самое, что и в этом: http://peter.hahndorf.eu/blog/

Вот что выглядит большинство сценариев. Обратите внимание, что с тех пор я добавил запись в файл и знаю, что эта строка становится пустой, когда скрипт запускается через TaskScheduler: < [array] $ vmNames = @ (Get-VM -Running |% {$ _. Elementname}) >

Опять же, он отлично работает через powershell.

Сценарий:

param($single_backup_file_to_loc, $single_backup_file_from_loc) 

function StopVMsInOrder ([array][String]$vmNames){ 
#this function will stop VM's in list, sequentially 

    Write-Host "Processing virtual machines in order" 
    foreach ($name in $vmNames) { 
     Write-Host "Analyzing $name" 
     Try { 
      #Write-Host "...Saving $name" 
      #Save-VM -VM $name -wait -Force 
      Write-Host "..shutdown $name" #name)" 
      Invoke-VMShutdown -VM $name -Force #$vm.name 
     } #try 
     Catch { 
      Write-Host "Failed to get virtual machine $name" 
     } #catch 
    }#foreach 



} #function StopVMsInOrder 

function StartVMsInOrder ([array][String]$vmNames){ 
#this function will start VM's in list, sequentially as opposed to all at once 

    Write-Host "Processing virtual machines in order" 
    foreach ($name in $vmNames) { 
     Write-Host "Analyzing $name" 
     Try { 
      Write-Host "..Starting $name" 
      Start-VM -VM $name -wait 
     } #try 
     Catch { 
      Write-Host "Failed to get virtual machine $name" 
     } #catch 
    }#foreach 

} #function StartVMsInOrder 

function CopyFileToFolder ([string]$Source,[string]$destination){ 
    # get filename 
    ... 
} 

#################start of script############## 

import-module Hyperv 

#get list of running vm's 
[array]$vmNames = @(Get-VM -Running | %{$_.elementname}) 

Write-Host "To: $single_backup_file_to_loc" 
Write-Host "From: $single_backup_file_from_loc" 

#call function to stop vm's 
StopVMsInOrder $vmNames  

if($single_backup_file_to_loc -ne " ") 
{ 
    #someone passed in a parameter for one-off use of script 
    [array]$destFileArray = @($single_backup_file_to_loc) 
    [array]$sourceFileArray = @($single_backup_file_from_loc) 
}else 
{ 
    Write-Host "To Loc not Defined as param" 
    #get set up for what need to backup vhd's 
    #where back it up to 
} 

$i=0 
for ($i = $sourceFileArray.GetLowerBound(0); $i -le $sourceFileArray.GetUpperBound(0); $i++) { 
     $tempSource = $sourceFileArray[$i] 
     $tempDest = $destFileArray[$i] 
     CopyFileToFolder $tempSource $tempDest 
     Write-Host "i: $i" 
} 

Write-Host "Done with vhd backup" 

#call function to start vm's 
StartVMsInOrder $vmNames 

Write-Host "Done with vm start" 

ответ

0

я, наконец, понял это! Я изменил его, поэтому использовал другую версию powershell в TaskScheduler:% SystemRoot% \ system32 .... Теперь он находит виртуальные машины.

Смежные вопросы