Powershell, удаленная работа и специальный доступ к папкам

Я работаю над некоторыми удаленными вещами, и у меня, похоже, проблема с переменными среды на удаленной машине. Код, который я использую для запуска удаленного задания,

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 предлагает встроенный доступ.

РЕДАКТИРОВАТЬ: Хм, еще один бит, который, кажется, отлично работает локально, но не удаленно, — это 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)

person Gordon    schedule 30.06.2015    source источник


Ответы (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
person user4003407    schedule 30.06.2015
comment
Интересный. Это помогает (по крайней мере, на пути к рабочему столу), но противоречит рекомендации из другого потока по удаленному взаимодействию со стандартным пользователем. тем не менее, удаление его, похоже, не вызывает проблем. Что касается Balloon Tips, возможно, это то, что нельзя сделать удаленно? - person Gordon; 30.06.2015