CreateProcessWithLogon&network resource - проблема с правами
От: j0t  
Дата: 10.05.06 20:45
Оценка:
Доброго времени суток!

Задача:
пользователь A (не администратор, член групы Users) запускает программу
(которую и разрабатываем), которая должна создать процесс (неинтерактивный)
от имени пользователя B (который на самом деле явл. локальным администратором)

Платформа:
WinXP SP2

Решение:
Использовал CreateProcessWithLogonW

     PROCESS_INFORMATION pi;
     memset( &pi, 0, sizeof( PROCESS_INFORMATION ) );

     STARTUPINFOW si;
     memset( &si, 0, sizeof( STARTUPINFOW ) );
     si.cb = sizeof(si);
     si.dwFlags = STARTF_USESHOWWINDOW;
     si.wShowWindow = SW_HIDE; 

     BOOL Result = CreateProcessWithLogonW(
              admName, // username
              L".",                  // domain
              admPwd,  // password
              LOGON_NETCREDENTIALS_ONLY,
              ServerExecutableUNC, // UNC path to application
              NULL,    // command line
              CREATE_DEFAULT_ERROR_MODE, // CreationFlags
              NULL,    // Environment
              NULL,    // CurrentDirectory
              &si, &pi );


Проблема:
Всe работало, пока приложение ServerExecutableUNC было на локальном диске.
Однако если оно расположено на сетевом ресурсе, который доступен для пользователя A (как и полагается),
но недоступен для пользователя В, то CreateProcessWithLogonW заканчивается неудачей.
(что-то вроде Unknown username or bad password)

Вот что пишет MSDN про CreateProcessWithLogonW:

CreateProcessWithLogonW accesses the specified directory and executable image in the security context of the target user. If the executable image is on a network and a network drive letter is specified in the path, the network drive letter is not available to the target user, as network drive letters can be assigned for each logon. If a network drive letter is specified, this function fails. If the executable image is on a network, use the UNC path.


Все так и получается.

Знаю, что есть функция CreateProcessAsUser, которая, похоже, могла бы подойти, поскольку

By default, CreateProcessAsUser accesses the directory and executable image in the security context of the caller.


Но заставить её работать из простого приложения (не сервиса) мне не удалось...

Как быть?

Если я все понимаю правильно, нужно как-то разрешить доступ пользователю B к сетевому ресурсу
(утрируя, где-то ввести имя/пароль), но где это делать?

Можно, конечно, скопировать ServerExecutable с сети на локальный диск перед запуском,
но очень не хотелось бы так делать.....

Заранее спасибо за помощь,
j0t.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.