我在将Powershell脚本作为指定用户调用时遇到问题,并希望有人提供有关如何进行故障排除的输入。
我有一个正常运行的脚本,可以将文件移动到名为“Move_files.ps1”的网络位置。从PS控制台手动运行时,这会毫无问题地运行(我使用我登录的凭据收集它)。
在生产中,将使用Oracle APEX(Web)前端和后端调用Move_Files.ps1。 windows命令行。因此,powershell脚本作为“系统”运行,用户是“匿名”,而不是有效凭据。
到目前为止,我所说的是名为“RUN.ps1”的powershell脚本,它应该使用特定凭据(具有必要的写入权限)来调用“Move_files.ps1”脚本。以下内容来自here。
$ScriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$User = "domain\username"
$secpass = ConvertTo-secureString "password" -asPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($User,$secpass)
#Call script which Moves CSV to share
start-process powershell.exe -ArgumentList "$ScriptPath\Move_files.ps1" -Credential $cred
从PS控制台成功调用上面的代码(RUN.ps1)并运行Move_files.ps1,但是当从APEX执行的CMD命令运行时,RUN.ps1运行但无法启动Move_files.ps1。
我记录了所有打开的PS1文件,以便查看文件何时打开。 Start-transcript没有提供任何可用的输出。非常感谢任何进一步的故障排除步骤或输入。
感谢您花时间帮忙解决这个问题!
更新1.由于PS1脚本从命令提示符启动,因此Transcript Start不会输出任何resulet。实际上必须从APEX& amp;生成日志文件。命令提示符(输出下面的详细信息):
Transcript started, output file is c:\Powershell\transcript0.txt
Start-Process : This command cannot be executed due to the error: Access is denied.
At C:\PowerShell\RUN.ps1:22 char:15 + start-process <<<< powershell.exe -Credential $cred -file "& $ScriptPath\Move_files.ps1" + CategoryInfo : InvalidOperation: (:) [Start-Process], InvalidOperationException + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand
我认为这个“访问错误”是由于从命令提示符调用powershell,因为使用的信用证具有该文件夹的管理员权限。下一步我猜是使用
行获取Local Environment VariablesGet-ChildItem Env:
快速如何重复这些步骤:
调用Powershell脚本的APEX代码
BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB(
job_name => 'PS_scripts' ,
job_type => 'EXECUTABLE',
job_action => 'C:\WINDOWS\system32\cmd.exe',
job_class => 'DEFAULT_JOB_CLASS',
comments => 'Job to test call out to batch script on Windows',
auto_drop => FALSE,
number_of_arguments => 2,
enabled => FALSE);
--SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( --this function is commented out
--job_name => 'PS_scripts' , --reason is /q turns echo off
--argument_position => 1, --& we need eccho to get the log!
--argument_value => '/q');
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
job_name => 'PS_scripts' ,
argument_position => 1, argument_value => '/c');
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
job_name => 'PS_scripts' ,
argument_position => 2,
argument_value => 'powershell "& C:\PowerShell\RUN.ps1" > "C:\Powershell\log.txt"'); --pipe the output here
SYS.DBMS_SCHEDULER.ENABLE( 'PS_scripts' );
END;
答案 0 :(得分:0)
我遇到了解决问题的功能。
Powershell后台智能传输服务(BITS)具有-Credential
字段,因此可以使用SYSTEM
之外的帐户中的凭据传输文件。
我遇到了解决方案here
我的Move_Files.ps1代码现在看起来像这样:
$ScriptPath = split-path -parent $MyInvocation.MyCommand.Definition
Function Get-PSCredential($User,$Password)
{
$SecPass = convertto-securestring -asplaintext -string $Password -force
$Creds = new-object System.Management.Automation.PSCredential -argumentlist $User,$SecPass
Return $Creds
}
Import-Module BitsTransfer
$Destination = "\\domain.lan\shared\New_Location"
$credential = Get-PSCredential -User username -Password password
Get-ChildItem -Path "$ScriptPath\Old_Location\*.csv" | Foreach-Object {Start-BitsTransfer -source $_.fullname -destination $Destination -credential $credential}
现在可以从RUN.ps1轻松调用Move_Files.ps1:
start-process Powershell.exe -noprofile -executionpolicy Bypass -file C:\Move_files.ps1
答案 1 :(得分:0)
通过映射网络驱动器和预缓存凭据来缩短解决方案。
找到here
我的工作代码(Move_files.ps1)
$ScriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$Destination = ""\\domain.lan\shared\New_Location"
$username = "username"
$password = "password"
net use $Destination $password /USER:$username
Get-ChildItem -Path "$ScriptPath\Old_Location\*.csv" | Foreach-Object { copy-item -Path $_.fullname -Destination $Destination }
#delete the share
net use $Destination /delete