Возникла необходимость написать web-интерфейс для управления Windows Media Server'ом, плейлист храниться в базе, ASP-страница для управления этим плейлистом вызывает написанное на C++ консольное приложение, которое подключается к БД и проводит необходимые манипуляции.
Все бы ничего, приложение работает, если кликнуть на него мышкой, зайдя в систему под правами администратора, но при вызове этого приложения через ASP-страницу возникает ошибка на CoInitialize, GetLastError дает 126 — "The specified module could not be found."....
Короче, подумал я — проблемы с доступом к COM-объекту, кстати, при вызове
CoCreateInstance(CLSID_WMSServer, NULL, CLSCTX_ALL, IID_IWMSServer, (void **)&pServer); ошибка №2 — "The system cannot find the file specified."
Тут началось шаманство, которое вначале заключалось в использовании разных ActiveX компонентов для вызова моего приложения, потом пытался использовать утилиты командной строки runas и wsremote для запуска под правами админа, потом я извращался с токенами:
HANDLE hToken = NULL;
HANDLE hThread = NULL;
BOOL bB;
bB=LogonUser("Administrator", NULL, "adminpass", LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken );
bB = RevertToSelf();
bB=ImpersonateLoggedOnUser(hToken);
hThread=GetCurrentThread();
bB = SetThreadToken(&hThread,hToken);
Но сие манипуляции не привели к эффекту.
Я даже пытался зациклить данную прогу вот так вот:
if (recurs=="false")
{
HANDLE hToken = NULL;
if ( LogonUser("Administrator", NULL, "adminpass", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken ) )
{
printf("Logon successfull\n");
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof( STARTUPINFO );
ImpersonateLoggedOnUser( hToken );
CString sPath;
sPath = "c:\\vc\\radio\\ver1\\Release\\wmsa.exe";
if (CreateProcessAsUser( hToken, sPath, NULL, NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, π ))
{
printf("Create successfull\n");
} else
{
printf("Error occured, error code %d\n", GetLastError());
}
}
}
Тут все нормально работает, точнее вышеприведенный код нормально работает — прога вызывает сама себя и добавляет параметр -recurs чтобы вышеприведенный код не выполнился заново.
Авторизация успешна, прога запускается — но опять та же ошибка.
Дальше я пробовал написать сервис на Delphi, который по таймеру каждые 10 сек. запускал это приложение, сервис я запустил под учетной записью Administrator, тоже без результатно.
Может, кто нибудь подскажет, в чем затык?