Powershell脚本作为特定用户

时间:2014-11-11 15:31:18

标签: powershell command-line oracle-apex credentials

我在将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 Variables
Get-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;

2 个答案:

答案 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