Я использую следующую команду Psexec запустить WScript файл на VMware Player 7 виртуальной машине:GetObject() 429 Ошибки при использовании Psexec Для запуска WScript файла на виртуальную машину
psexec \\devtest1 -u "Administrator" -p "password" -h -i 1 -d c:\windows\system32\wscript.exe c:\scripts\closefiles.vbs
Эта команда Psexec бежит файл closefiles.vbs на виртуальной машине DEVTEST1. При запуске файл closefiles.vbs должен обнаруживать любой открытый экземпляр Excel 2007 и, если он найден, сохраняет каждую открытую книгу, а затем закрывает каждую книгу. При запуске локально на виртуальной машине closefiles.vbs выполняется отлично.
Проблема возникает, когда я использую PSExec с удаленной машины для выполнения файла closefiles.vbs на виртуальной машине. Windows 7 заблокировала удаленный доступ UAC для предотвращения атак на шлейф. По соображениям безопасности я должен соблюдать это ограничение (я НЕ знаю, как изменить реестр, чтобы удалить ограничение удаленного доступа UAC). Это означает, что единственная учетная запись, которую я могу использовать для запуска любого приложения на виртуальной машине без использования клиента удаленного рабочего стола (который я не могу использовать в этом приложении), является учетной записью администратора виртуальной машины.
Когда я бег closefiles.vbs на виртуальной машине с помощью Psexec и учетной записи администратора виртуальной машины и пароля от удаленной машины он дает мне ошибку 429, когда он встречает следующее заявление:
Set objXL = GetObject(, "Excel.Application")
Это ВСЕГДА происходит, когда команда PSExec запускается против виртуальной машины, когда на виртуальной машине регистрируется любой пользователь, кроме Администратора. Но когда администратор входит в систему на виртуальной машине, файл closefiles.vbs выполняется отлично. Почему closefiles.vbs работает, когда администратор виртуальной машины входит в систему, а не когда какой-либо другой пользователь виртуальной машины входит в систему? Как я могу исправить эту проблему? Вот код closefiles.vbs:
Option Explicit
'--------------------------------------------------
'*** Dimension Local Variables ***
Dim objXL, i
'*** Enable Error Handling ***
On Error Resume Next
'*** Set Excel Object Variable ***
Set objXL = GetObject(, "Excel.Application")
'*** Trap Error And Shutdown Computer If No Open Excel Workbooks ***
If Err.Number > 0 Then 'No open Excel workbooks
MsgBox ("ErrorLevel ... " & Err.Number)
Wscript.quit
End If
'*** Save Data And Close Each Open Excel Workbook ***
For Each i In objXL.Workbooks 'Close each open Excel workbook
i.Save
i.Close
Next
Заранее благодарим за любую помощь, которую вы можете предоставить.
Дважды проверьте номер сеанса, что интерактивный пользователь регистрируется на, т.е., '-i 1' в Psexec командной строки. Диспетчер задач может отображать номера сеансов с помощью опции «Выбрать столбцы». Но я не удивлюсь, если COM может найти только существующие объекты Excel.Application, связанные с тем же пользователем, который выполняет вызов. –
Я не включал это в свой первоначальный пост, но я использую qwinsta для запроса виртуальной машины и возвращения ее активного номера сеанса пользователя в команду PSExec в качестве переменной% id% (и qwinsta, и PSExec присутствуют в том же .cmd, который запускается с удаленного компьютера с виртуальной машиной). Я хотел сохранить свой оригинальный пост как можно проще. Я знаю, что номер сеанса работает в интерактивном режиме, потому что я могу успешно отобразить сообщение WScript shell.popup на виртуальной машине. Есть ли способ, что COM не будет «видеть» номер сеанса, который работает в интерактивном режиме? –
Если сценарий может отображать сообщение пользователю, он работает в правильном сеансе, так что это не ваша проблема.Скорее всего, COM или объекты COM COM обеспечивают разделение между различными учетными записями пользователей. Однако это может быть связано с psexec. Чтобы устранить эту возможность, попробуйте войти в виртуальную машину в качестве другого пользователя, а затем используйте «запустить как» для запуска сценария в контексте учетной записи администратора. Я подозреваю, что вы обнаружите, что это тоже не сработает. –