2015-06-30 6 views
0

Я работаю над некоторыми удаленными вещами, и у меня, похоже, проблема с переменными окружения на удаленной машине. Код, я использую для запуска удаленной работы является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 («Рабочий стол») ничего не возвращает. Я пробовал все разные подходы, с назначением переменной, заключенным в кавычки, например $ fileName, и встроенным в Write-Host и т. Д. Все решения работают «локально», но ни одна из них не работает на удаленном компьютере, но только рабочий стол является проблемой , Мой прецедент для этого удаленного задания потребует доступа к множеству пользовательских специальных папок, поэтому я надеюсь, что здесь есть что-то основное, чего я не вижу. в противном случае, я думаю, я могу просто скопировать все пути с помощью $ ([Environment] :: UserName), вложенных в строку, но не очень элегантный, когда PS предлагает встроенный доступ.

EDIT: Hrm, еще один бит, который, кажется, работает нормально локально, но не удаленно - это воздушные шары. Поскольку это мой пример

[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) 

ответ

0

Не используйте -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 
+0

Интересно. Это делает трюк (по крайней мере на пути к рабочему столу), но он противоречит рекомендациям другого потока о том, что вы удаляете работу со стандартным пользователем. при этом удаление, похоже, не вызывает проблем. Что касается Balloon Tips, это просто возможно что-то, что нельзя сделать удаленно? – Gordon

 Смежные вопросы

  • Нет связанных вопросов^_^