, где PInfo — как раз PROCESS_INFORMATION. Теперь интересно, чем мне может помощь информация о запущенном процессе. А НУЖНО следующее. Выше я запустил под другим пользователем приложение Excel. И теперь в этом приложении нужно открыть файл — а для этого до приложения надо как-то достучаться. Вот как, если я знаю только id процесса? Есть идея по id узнать HWND, но я пока не знаю как...
Примечание. Если сразу открывать нужный файл внутри функции — не получается. Отчасти может потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ! Доступ только у пользователя, под которым открывается Excel. Вот поэтому все это и затеял
Здравствуйте, Lonely Dog, Вы писали:
LD>Здравствуйте, agendus, Вы писали:
LD>Может просто передать имя нужного файла через командную строку?
Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.
Здравствуйте, agendus, Вы писали:
A>Здравствуйте, Lonely Dog, Вы писали:
LD>>Здравствуйте, agendus, Вы писали:
LD>>Может просто передать имя нужного файла через командную строку?
A>Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, agendus, Вы писали:
A>>Здравствуйте, Lonely Dog, Вы писали:
LD>>>Здравствуйте, agendus, Вы писали:
LD>>>Может просто передать имя нужного файла через командную строку?
A>>Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.
Ovl>совсем-совсем не получается? а что говорит?
"Говорит" уже запущенный Excel — что дескать нет такого файла, надо бы проверить правильность имени и пути. Но! ФАЙЛ ЕСТЬ И ИМЯ ПРАВИЛЬНОЕ!!!
Здравствуйте, agendus, Вы писали:
A>Здравствуйте, Ovl, Вы писали:
Ovl>>Здравствуйте, agendus, Вы писали:
A>>>Здравствуйте, Lonely Dog, Вы писали:
LD>>>>Здравствуйте, agendus, Вы писали:
LD>>>>Может просто передать имя нужного файла через командную строку?
A>>>Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.
Ovl>>совсем-совсем не получается? а что говорит?
A>"Говорит" уже запущенный Excel — что дескать нет такого файла, надо бы проверить правильность имени и пути. Но! ФАЙЛ ЕСТЬ И ИМЯ ПРАВИЛЬНОЕ!!!
если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?
У меня есть локальная копия нужного файла — только что открыл его без проблем — значит проблема НЕ В ИМЕНИ ФАЙЛА. ...и не в пути — путь я задаю верный 100%
Здравствуйте, agendus, Вы писали:
A>У меня есть локальная копия нужного файла — только что открыл его без проблем — значит проблема НЕ В ИМЕНИ ФАЙЛА. ...и не в пути — путь я задаю верный 100%
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, agendus, Вы писали:
A>>
A>>если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?
A>>Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.
Ovl>может тогда impersonate попробовать?
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, agendus, Вы писали:
A>>У меня есть локальная копия нужного файла — только что открыл его без проблем — значит проблема НЕ В ИМЕНИ ФАЙЛА. ...и не в пути — путь я задаю верный 100%
LT>Путь закавычь.
, так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами? Здесь оно вымышлено — но суть та же — имя С ПРОБЕЛАМИ, блин, и не мне это менять.
Здравствуйте, agendus, Вы писали:
A>Здравствуйте, Ovl, Вы писали:
Ovl>>Здравствуйте, agendus, Вы писали:
A>>>
A>>>если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?
A>>>Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.
Ovl>>может тогда impersonate попробовать?
A>То есть? Что это значит?
я имел ввиду явный логон (LogonUser). Но возможно это не поможет.
Можно скопировать этот файл туда, куда пользователь имеет доступ?
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, agendus, Вы писали:
A>>Здравствуйте, Ovl, Вы писали:
Ovl>>>Здравствуйте, agendus, Вы писали:
A>>>>
A>>>>если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?
A>>>>Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.
Ovl>>>может тогда impersonate попробовать?
A>>То есть? Что это значит?
Ovl>я имел ввиду явный логон (LogonUser). Но возможно это не поможет.
Ovl>Можно скопировать этот файл туда, куда пользователь имеет доступ?
Думаю о варианте LogonUser -> CreateProcessAsUser вместо CreateProcessWithLogonW... но разве суть не одна и та же? То есть сначала гарантированно залогиниться под новым пользователем, и потом уж этот hToken передавать для запуска? Есть еще вариант SHCreateProcessAsUserW... блин весь API не перероешь. Вот найти бы функцию, которая из ID процесса даст доступ к объекту.
А копировать файл туду где есть доступ нельзя. Можно б было — вся эта заваруха и не поднималась бы
A>Думаю о варианте LogonUser -> CreateProcessAsUser вместо CreateProcessWithLogonW... но разве суть не одна и та же? То есть сначала гарантированно залогиниться под новым пользователем, и потом уж этот hToken передавать для запуска? Есть еще вариант SHCreateProcessAsUserW... блин весь API не перероешь. Вот найти бы функцию, которая из ID процесса даст доступ к объекту. A>А копировать файл туду где есть доступ нельзя. Можно б было — вся эта заваруха и не поднималась бы
Здравствуйте, Ovl, Вы писали:
A>>Думаю о варианте LogonUser -> CreateProcessAsUser вместо CreateProcessWithLogonW... но разве суть не одна и та же? То есть сначала гарантированно залогиниться под новым пользователем, и потом уж этот hToken передавать для запуска? Есть еще вариант SHCreateProcessAsUserW... блин весь API не перероешь. Вот найти бы функцию, которая из ID процесса даст доступ к объекту. A>>А копировать файл туду где есть доступ нельзя. Можно б было — вся эта заваруха и не поднималась бы
Ovl>дело в том, что по умолчанию excel наверное запускается по DDE Ovl>Посмотрите заметку http://www.vadriano.com/excel-vb/2007/04/12/how-to-open-excel-files-in-a-new-application-instance/, и сравните со своими настройками Open для Excel.
Ovl>Попробуйте вместо "excel <somefile>" использовать "<fullexcelpath>/excel.exe <somefile>"
Непонятно, как это может влиять. Попробовал — прописал полный путь к excel.exe — та же петрушка...
Здравствуйте, agendus, Вы писали:
A>CmdLine = "excel " & Chr(34) & fName & Chr(34) & A>[/vb], так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами?
Кавычат, конечно, не так, но — не суть дела.
Во-первых, SInfo нуждается в инициализации.
Во-вторых, что за "excel" — в общем случае нужен полный путь (как правило, закавычен).
В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.
В-четвертых, два раза прочитал "потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ!
Доступ только у пользователя, под которым открывается Excel" — и ничего не понял.
Дык, это, что же, клиенты терминал-сервера?
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, agendus, Вы писали:
A>>CmdLine = "excel " & Chr(34) & fName & Chr(34) & A>>[/vb], так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами?
LT>Кавычат, конечно, не так, но — не суть дела.
LT>Во-первых, SInfo нуждается в инициализации. LT>Во-вторых, что за "excel" — в общем случае нужен полный путь (как правило, закавычен). LT>В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.
LT>В-четвертых, два раза прочитал "потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ! LT>Доступ только у пользователя, под которым открывается Excel" — и ничего не понял. LT>Дык, это, что же, клиенты терминал-сервера?
Спасибо за детальный ответ.
Начну с конца — подробней и проще опишу задачу. У сотрудников запрещен доступ к некоторым корпоративным файлам, но... информацию оттуда надо получать. Завели специальную учетку, под которой возможен доступ к секретным директориям и файлам. По идее, нажали кнопку — запускается открытие файла под этой учеткой (в скрытом режиме — люди ничего не увидят), считываются данные и файл закрывается. Все!
Я уже указываю полный путь к Excel.
Насчет инициализации. В С++ можно ZeroMemory и пр. А как в VB инициализировать структуру (как я понимаю нужно ее обнулить, так как потом я задаю значения некоторых полей)?
Раз я пишу на VBA в Excel, а не в IDE Visual Basic, мне придется создавать класс наподобие ProcessStartInfo, так ведь? Определить все поля, методы, указать что методы импортировать из System.dll.
Или как еще импортировать класс можно? Пробовал
Public Declare Class ProcessStartInfo Lib"System.dll"
В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.
Было бы чего анализировать — при выполнении моего кода ошибки то не происходит — процесс (Excel) успешно запускается. А уже в нем файл нужный не открывается
Res = CreateProcessWithLogonW(StrPtr(sUsername), StrPtr(sDomain), StrPtr(sPwd), _
LOGON_NETCREDENTIALS_ONLY, _
0&, StrPtr(sCmd), _
0&, _
ByVal 0&, _
StrPtr(sDir), _
SInfo, PInfo)
If Res <> 0 Then' 'я попадаю сюда - все ОК!!!
hProcess = PInfo.hProcess
ProcID = PInfo.dwProcessId
If Wait Then
If WaitForSingleObject(PInfo.hProcess, _
Timeout) = WAIT_TIMEOUT Then
RunAs = WAIT_TIMEOUT
If Terminate Then
If TerminateProcess(PInfo.hProcess, 0) = 0 Then
RunAs = Err.LastDllError
End If
End If
End If
End If
Else
RunAs = Err.LastDllError
MsgBox GetErrorMessage(RunAs)
hProcess = 0
ProcID = 0
End If
Здравствуйте, agendus, Вы писали:
A>Раз я пишу на VBA в Excel, а не в IDE Visual Basic, мне придется создавать класс наподобие ProcessStartInfo, так ведь? Определить все поля, методы, указать что методы импортировать из System.dll. A>Или как еще импортировать класс можно? Пробовал A>
A>Public Declare Class ProcessStartInfo Lib"System.dll"
A>
, но так нельзя.
Тогда попробуйте в CreateProcessWithLogonW заменить LOGON_NETCREDENTIALS_ONLY на LOGON_WITH_PROFILE