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...
Пока на собственное сообщение не было ответов, его можно удалить.