在远程系统上执行文件

在远程系统上执行文件

用户会间歇性地遇到极端的登录时间(10 分钟)。我工作的公司目前不使用站点,因此用户可以从美国各地的 DC 进行身份验证或申请 GP。经过一番研究,我能够开发一个可以捕获有用信息的 powershell 脚本 - 脚本如下。无论如何,我将脚本复制到了各种机器上。现在我只需要能够根据需要远程运行脚本。我为 PS 脚本创建了一个快捷方式,以绕过执行策略设置(当前为默认设置)。我尝试使用 psexec.exe 和 powershell 执行快捷方式,但都无法正常工作。

执行程序

psexec $computer -u $user $file

错误:PsExec 无法在 $computer 上启动 $file:系统找不到指定的文件。

同时,我可以在本地双击快捷方式,并且它可以正常工作。

电源外壳

PS [Local Computer]>Enter-PSSession -ComputerName $computer -Credential $user
PS [Remote Computer]>cmd /c $file

错误:在远程服务器上启动命令失败,并显示以下错误消息:由于线程退出或应用程序请求,I/O 操作已中止...

脚本

$USER = $env:username.ToUpper()
$COMPUTER = $env:computername.ToUpper()
$Current_Time = Get-Date
$PCname = ''
$addedtime = 0
$LogonServer = $env:logonserver
$GPApplied = cmd /c gpresult /r | find "Last time Group Policy was applied"
$GPServer = cmd /c gpresult /r | find "Group Policy was applied from"
$LogonInfo = "C:\Temp\LogonDurations.txt"
$GPApplied = $GPApplied.TrimStart() 
$GPServer = $GPServer.TrimStart() 

#Get event time of last successful logon
$filterXML = @'
<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Microsoft-Windows-Winlogon'] and (Level=4 or Level=0) and (EventID=7001)]]</Select>
  </Query>
</QueryList>
'@
$LogonDateTime=(Get-WinEvent -ComputerName $PCname -MaxEvents 1 -FilterXml $filterXML -ErrorAction SilentlyContinue).timecreated

#Get Win License validated after logon (about same time as explorer loads)
$filterXML = @'
<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[Provider[@Name='Microsoft-Windows-Winlogon'] and (Level=4 or Level=0) and (EventID=4101)]]</Select>
  </Query>
</QueryList>
'@
$DesktopTime=(Get-WinEvent -ComputerName $PCname -MaxEvents 1 -FilterXml $filterXML).timecreated

#Get Logon Duration
$LogonDuration = "{0:N1}" -f ((($DesktopTime - $LogonDateTime).TotalSeconds + $addedtime)/60)

$output = @"
------------------------------------------------------------------ 
$COMPUTER $Current_Time 
------------------------------------------------------------------ 
Logon Server:  $logonserver 
$GPApplied
$GPServer

Successful Logon @  $LogonDateTime  
Desktop Appeared @  $DesktopTime 
Duration of Logon =  $LogonDuration minutes  

"@

$output | out-file -FilePath $logoninfo -Append 

答案1

这是我使用的方法,效果非常好:

PSEXEC \\MachineName -u 用户名 -p 密码 -w WorkingFolder powershell.exe -ExecutionPolicy Bypass -Command FullPathToScript.ps1

鉴于重新格式化的问题(感谢 HBruijn),当您调用 PSEXEC 时,它试图从某个未知的工作文件夹运行 $file。使用 PSEXEC 命令行上的 -w 开关将其设置为远程计算机上 ps1 所在的文件夹。假设权限在其他方面都一致,那么您应该可以成功执行。

我实际使用 PSEXEC 调用 PowerShell 本身的原因是为了确保设置了 ExecutionPolicy。这与我设置工作文件夹然后完全限定 ps1 路径的原因大致相同。我尝试尽可能明确地说明,以便在出现问题时帮助排除故障。

相关内容