【问题标题】:Powershell, Remote Job and special folder accessPowershell、远程作业和特殊文件夹访问
【发布时间】:2015-06-30 16:36:33
【问题描述】:

我正在处理一些远程处理问题,但我似乎对远程计算机上的环境变量有疑问。我用来启动远程作业的代码是

Invoke-Command -sessionOption:(New-PSSessionOption -noMachineProfile) -computerName:$machine -argumentList: $filePath –scriptblock {
   param (
      [String]$filePath
   )

   & powershell.exe -noProfile -executionpolicy bypass -file $filePath

} -credential:$credential  -authentication:CredSSP –asJob -jobName:$machine > $null

而我远程运行的代码是

$fileName = "$([Environment]::UserName).log"          
$desktop = [Environment]::GetFolderPath("Desktop")


Write-Host "$desktop\$fileName!"

现在,据我了解,最后一段代码实际上是在远程机器上运行的,在 $credentials 中的用户凭据上下文中。我本来希望这会导致返回用户桌面上虚拟日志文件的完整路径。但是,在远程计算机上 [Environment]::UserName 工作正常,但 [Environment]::GetFolderPath("Desktop") 没有返回任何内容。我尝试了所有不同的方法,变量赋值用 $fileName 之类的引号括起来,并在 Write-Host 中内联等。所有解决方案都“在本地”工作,但在远程机器上都没有工作,但只有桌面是一个问题.我的这个远程工作的用例将需要访问很多用户特殊文件夹,所以我希望这里有一些我缺少的基本内容。否则我想我可以在字符串中内联 $([Environment]::UserName) 对所有路径进行硬编码,但当 PS 提供内置访问时,它就不是很优雅了。

编辑:Hrm,另一个在本地似乎可以正常工作但不能在远程工作的位是 Balloon Tips。这是我的例子

    [void[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$path = Get-Process -id $pid | Select-Object -ExpandProperty Path
$balloonTip = New-Object System.Windows.Forms.NotifyIcon 
$balloonTip.icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balloonTip.balloonTipIcon = "Info"
$balloonTip.balloonTipText = "Testing, one, two"
$balloonTip.balloonTipTitle = "$([Environment]::UserName)" 

$balloonTip.visible = $true 
$balloonTip.showBalloonTip(0)

【问题讨论】:

    标签: powershell special-folders


    【解决方案1】:

    不要使用-NoMachineProfile:

    -NoMachineProfile <SwitchParameter>
        Prevents loading the user's Windows user profile. As a result,
        the session might be created faster, but user-specific registry
        settings, items such as environment variables, and certificates
        are not available in the session.
    

    您的命令不在交互式用户会话中运行(尝试[Environment]::UserInteractive),因此命令无法通过显示对话框窗口或气球提示与会话进行交互。如果你想交互地执行一些命令,那么你可以使用任务调度器:

    Register-ScheduledTask -TaskName NotepadTask `
                           -Action (New-ScheduledTaskAction -Execute Notepad) `
                           -Principal (New-ScheduledTaskPrincipal -UserId TestUser -LogonType Interactive)
    Start-ScheduledTask -TaskName NotepadTask
    

    【讨论】:

    • 有趣。这可以解决问题(至少在桌面路径上),但它与其他线程关于让远程处理与标准用户一起工作的建议相冲突。也就是说,删除它似乎不会导致问题。关于气球提示,这可能只是无法远程完成的事情吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2012-04-02
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多