我可以在powershell中以管理员身份运行我的powershell脚本,它会生成运行VM的良好列表。但是当我在具有最高权限的TaskScheduler中运行它时,它显示了一个运行VM的空列表。我们有Server 2008 R2,PowerShell V3,最近我下载了PowerShell的Hyper-V模块。我在具有管理员权限的服务器上创建了一个帐户,管理员可以完全控制脚本从/向其复制文件的所有目录。
此外,当我通过powershell运行脚本时,我需要以管理员身份运行。当我使用powershell提示运行它时,它就是这样的:
C:\ Windows \ System32下> powershell -NoProfile -noninteractive -ExecutionPolicy bypass -Command“& c:\ Scripts \ BackupVhdShell_2_param.ps1 -single_backup_file_to_loc'E:\'-single_backup_file_from_loc'S:\ SQL-bak.vhd'”
这样从powreshell开始/停止vm和复制文件。
在任务计划程序中,这就是我设置它的方式,它会生成正在运行的VM的空列表:
检查以最高权限运行。我保存了我的登录凭据,因此当我不在这里或者它没有启动时它可以唤醒服务器。
在“程序/脚本”字段中:%SystemRoot%\ SysWow64 \ WindowsPowerShell \ v1.0 \ powershell.exe
在Add Arguments字段中:-NoProfile -noninteractive -ExecutionPolicy bypass -Command“&amp; c:\ Scripts \ BackupVhdShell_2_param.ps1 -single_backup_file_to_loc'E:\'-single_backup_file_from_loc'S:\ SQL-bak.vhd'”< / p>
有什么想法?我不确定TaskManager是否找不到HyperV模块?或者我可能需要Runas让它成为管理员?我无法找到相关信息。此链接类似但不同:http://ss64.com/nt/runas.html与此相同:http://peter.hahndorf.eu/blog/
这是大多数脚本的样子。请注意,我已经将日志记录添加到文件中,并且知道当脚本通过TaskScheduler运行时,此行将变为空:&lt; [array] $ vmNames = @(Get-VM -Running |%{$ _。elementname} )&GT;
同样,它通过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 :(得分:0)
我终于明白了!我更改了它,所以我在TaskScheduler中使用了powershell的另一个版本:%SystemRoot%\ system32 ....现在它正在找到VM。