Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 11:26
Оценка:
Добрый день.
Вопрос такой. У меня есть информация о процессе — структура PROCESS_INFORMATION. Взялась такая радость благодаря выполнению ф-ции :

Res = CreateProcessWithLogonW(StrPtr(sUsername), StrPtr(sDomain), StrPtr(sPwd), _
                                  LOGON_NETCREDENTIALS_ONLY, _
                                  0&, StrPtr(sCmd), _
                                  0&, _
                                  ByVal 0&, _
                                  StrPtr(sDir), _
                                  SInfo, PInfo)
, где PInfo — как раз PROCESS_INFORMATION. Теперь интересно, чем мне может помощь информация о запущенном процессе. А НУЖНО следующее. Выше я запустил под другим пользователем приложение Excel. И теперь в этом приложении нужно открыть файл — а для этого до приложения надо как-то достучаться. Вот как, если я знаю только id процесса? Есть идея по id узнать HWND, но я пока не знаю как...

Примечание. Если сразу открывать нужный файл внутри функции — не получается. Отчасти может потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ! Доступ только у пользователя, под которым открывается Excel. Вот поэтому все это и затеял
Re: Знаю ID процесса... что дальше?
От: Lonely Dog Россия  
Дата: 19.11.08 11:48
Оценка:
Здравствуйте, agendus, Вы писали:

Может просто передать имя нужного файла через командную строку?
Re[2]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 12:05
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, agendus, Вы писали:


LD>Может просто передать имя нужного файла через командную строку?


Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.
Re[3]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 12:08
Оценка:
Здравствуйте, agendus, Вы писали:

A>Здравствуйте, Lonely Dog, Вы писали:


LD>>Здравствуйте, agendus, Вы писали:


LD>>Может просто передать имя нужного файла через командную строку?


A>Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.


совсем-совсем не получается? а что говорит?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[4]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 12:17
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>Здравствуйте, agendus, Вы писали:


A>>Здравствуйте, Lonely Dog, Вы писали:


LD>>>Здравствуйте, agendus, Вы писали:


LD>>>Может просто передать имя нужного файла через командную строку?


A>>Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.


Ovl>совсем-совсем не получается? а что говорит?


"Говорит" уже запущенный Excel — что дескать нет такого файла, надо бы проверить правильность имени и пути. Но! ФАЙЛ ЕСТЬ И ИМЯ ПРАВИЛЬНОЕ!!!
Re[5]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 12:33
Оценка:
Здравствуйте, agendus, Вы писали:

A>Здравствуйте, Ovl, Вы писали:


Ovl>>Здравствуйте, agendus, Вы писали:


A>>>Здравствуйте, Lonely Dog, Вы писали:


LD>>>>Здравствуйте, agendus, Вы писали:


LD>>>>Может просто передать имя нужного файла через командную строку?


A>>>Я же говорю — пробовал так. Файл не открывается. Когда я программно открываю новый Excel под др. пользователем, а потом РУКАМИ открываю в нем нужный файл — он открывается. Вот поэтому и хочу после запуска получить доступ к объекту Excel, имея на входе ID процесса.


Ovl>>совсем-совсем не получается? а что говорит?


A>"Говорит" уже запущенный Excel — что дескать нет такого файла, надо бы проверить правильность имени и пути. Но! ФАЙЛ ЕСТЬ И ИМЯ ПРАВИЛЬНОЕ!!!


если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[6]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 12:54
Оценка:

если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?

Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.
Re[6]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 12:58
Оценка:
У меня есть локальная копия нужного файла — только что открыл его без проблем — значит проблема НЕ В ИМЕНИ ФАЙЛА. ...и не в пути — путь я задаю верный 100%
Re[7]: Знаю ID процесса... что дальше?
От: Leonid Troyanovsky  
Дата: 19.11.08 13:02
Оценка: +1
Здравствуйте, agendus, Вы писали:

A>У меня есть локальная копия нужного файла — только что открыл его без проблем — значит проблема НЕ В ИМЕНИ ФАЙЛА. ...и не в пути — путь я задаю верный 100%


Путь закавычь.
--
С уважением, LVT
Re[7]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 13:09
Оценка:
Здравствуйте, agendus, Вы писали:


A>

A>если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?

A>Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.

может тогда impersonate попробовать?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[8]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 13:16
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>Здравствуйте, agendus, Вы писали:



A>>

A>>если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?

A>>Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.

Ovl>может тогда impersonate попробовать?


То есть? Что это значит?
Re[8]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 13:20
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, agendus, Вы писали:


A>>У меня есть локальная копия нужного файла — только что открыл его без проблем — значит проблема НЕ В ИМЕНИ ФАЙЛА. ...и не в пути — путь я задаю верный 100%


LT>Путь закавычь.


Если Вы об этом:

fName = "G:\PROJECTS\price list.xls"
CmdLine = "excel " & Chr(34) & fName & Chr(34) &
, так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами? Здесь оно вымышлено — но суть та же — имя С ПРОБЕЛАМИ, блин, и не мне это менять.
Re[9]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 13:29
Оценка:
Здравствуйте, agendus, Вы писали:

A>Здравствуйте, Ovl, Вы писали:


Ovl>>Здравствуйте, agendus, Вы писали:



A>>>

A>>>если он пытается открыть файл, то значит он уже запущен. полагаю со всеми нужными правами проблема в имени файла или в процессе запуска?

A>>>Вот и я полагаю, что после запуска Excel уже есть нужные права доступа. Сообщение о невозможности открыть файл я вижу уже при активном Excel.

Ovl>>может тогда impersonate попробовать?


A>То есть? Что это значит?


я имел ввиду явный логон (LogonUser). Но возможно это не поможет.

Можно скопировать этот файл туда, куда пользователь имеет доступ?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[10]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 13:37
Оценка:
Здравствуйте, 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 процесса даст доступ к объекту.
А копировать файл туду где есть доступ нельзя. Можно б было — вся эта заваруха и не поднималась бы
Re[11]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 13:42
Оценка:
A>Думаю о варианте LogonUser -> CreateProcessAsUser вместо CreateProcessWithLogonW... но разве суть не одна и та же? То есть сначала гарантированно залогиниться под новым пользователем, и потом уж этот hToken передавать для запуска? Есть еще вариант SHCreateProcessAsUserW... блин весь API не перероешь. Вот найти бы функцию, которая из ID процесса даст доступ к объекту.
A>А копировать файл туду где есть доступ нельзя. Можно б было — вся эта заваруха и не поднималась бы

дело в том, что по умолчанию excel наверное запускается по DDE
Посмотрите заметку http://www.vadriano.com/excel-vb/2007/04/12/how-to-open-excel-files-in-a-new-application-instance/, и сравните со своими настройками Open для Excel.

Попробуйте вместо "excel <somefile>" использовать "<fullexcelpath>/excel.exe <somefile>"
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[12]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 13:45
Оценка:
Ovl>Попробуйте вместо "excel <somefile>" использовать "<fullexcelpath>/excel.exe <somefile>"

правда в этом случае он может сказать что какой-нить personal.xlb залочен, но это уже другая история.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[12]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 13:49
Оценка:
Здравствуйте, 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 — та же петрушка...
Re[9]: Знаю ID процесса... что дальше?
От: Сергей  
Дата: 19.11.08 14:10
Оценка:
Здравствуйте, agendus, Вы писали:

A>
A>fName = "G:\PROJECTS\price list.xls"
A>CmdLine = "excel " & Chr(34) & fName & Chr(34) & 
A>


Я в VB не силён, но всё же — может, бэкслеши экранировать надо?
Re[10]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 19.11.08 14:19
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Здравствуйте, agendus, Вы писали:


A>>
A>>fName = "G:\PROJECTS\price list.xls"
A>>CmdLine = "excel " & Chr(34) & fName & Chr(34) & 
A>>


С>Я в VB не силён, но всё же — может, бэкслеши экранировать надо?



Да нет, не надо... хотя я попробовал — чем черт не шутит
Re[13]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 16:03
Оценка:
кстати, а почему не использовать Process.Start и ProcessStartInfo, если уж вы пишите на VB?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[9]: Знаю ID процесса... что дальше?
От: Leonid Troyanovsky  
Дата: 19.11.08 16:11
Оценка:
Здравствуйте, agendus, Вы писали:

A>CmdLine = "excel " & Chr(34) & fName & Chr(34) &

A>[/vb], так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами?

Кавычат, конечно, не так, но — не суть дела.

Во-первых, SInfo нуждается в инициализации.
Во-вторых, что за "excel" — в общем случае нужен полный путь (как правило, закавычен).
В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.

В-четвертых, два раза прочитал "потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ!
Доступ только у пользователя, под которым открывается Excel" — и ничего не понял.
Дык, это, что же, клиенты терминал-сервера?
--
С уважением, LVT
Re[14]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 19.11.08 16:19
Оценка:
в общем дошли руки попробовать

так — работает
        public static void Main()
        {
            SecureString pass = new SecureString();
            Array.ForEach("luserluser".ToCharArray(), delegate(char ch) { pass.AppendChar(ch); });

            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = @"E:\Program Files\Microsoft Office\Office12\excel.exe";
            psi.Arguments = @"""\\ologinov\777\te st.xls""";
            psi.UserName = "tuser";
            psi.Password = pass;
            psi.Domain = "ologinov";
            psi.LoadUserProfile = true;
            psi.UseShellExecute = false;

            Process.Start(psi);
        }


без LoadUserProfile — действительно выдает ошибку
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: Знаю ID процесса... что дальше?
От: игппук Беларусь  
Дата: 19.11.08 16:44
Оценка:
разве нельзя использовать COM и automation? excel реализован как com объект, выставляет наружу все нужные интерфейсы, документации и примеров хватает.
проклятый антисутенерский закон
Re[10]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 20.11.08 06:13
Оценка:
Здравствуйте, 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 инициализировать структуру (как я понимаю нужно ее обнулить, так как потом я задаю значения некоторых полей)?
Re[15]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 20.11.08 06:16
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>в общем дошли руки попробовать


Ovl>так — работает

Ovl>
Ovl>        public static void Main()
Ovl>        {
Ovl>            SecureString pass = new SecureString();
Ovl>            Array.ForEach("luserluser".ToCharArray(), delegate(char ch) { pass.AppendChar(ch); });

Ovl>            ProcessStartInfo psi = new ProcessStartInfo();
Ovl>            psi.FileName = @"E:\Program Files\Microsoft Office\Office12\excel.exe";
Ovl>            psi.Arguments = @"""\\ologinov\777\te st.xls""";
Ovl>            psi.UserName = "tuser";
Ovl>            psi.Password = pass;
Ovl>            psi.Domain = "ologinov";
Ovl>            psi.LoadUserProfile = true;
Ovl>            psi.UseShellExecute = false;

Ovl>            Process.Start(psi);
Ovl>        }

Ovl>


Ovl>без LoadUserProfile — действительно выдает ошибку


Спасибо за пример, только... что это за Process.Start и ProcessStartInfo? Помощь VBA ничего такого не выдает
Re[15]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 20.11.08 06:21
Оценка:
Так, в MSDN нашел — сейчас буду разбираться
Re[15]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 20.11.08 07:11
Оценка:
Раз я пишу на VBA в Excel, а не в IDE Visual Basic, мне придется создавать класс наподобие ProcessStartInfo, так ведь? Определить все поля, методы, указать что методы импортировать из System.dll.
Или как еще импортировать класс можно? Пробовал
Public Declare Class ProcessStartInfo Lib "System.dll"
, но так нельзя.
Re[10]: Знаю ID процесса... что дальше?
От: agendus  
Дата: 20.11.08 07:35
Оценка:

В-третьих, есть такая функция 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
Re[16]: Знаю ID процесса... что дальше?
От: Ovl Россия  
Дата: 20.11.08 10:27
Оценка:
Здравствуйте, 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
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.