Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6302
Последний выпуск: 19.06.2015

Вопрос по API

290
27 октября 2014 года
Patr1ot
458 / / 09.02.2008
Добрый день.
Нужна помощь с функцией CreateProcessWithLogonW

Почему то на компе где установлена среда C++ Builder она работает,
компилю проект со всеми библиотеками. На другом компе, программа запускается работает, но функция CreateProcessWithLogonW нет, не запускается.

С чем это может быть связано? Библиотеки? Инклюды добавлял windows.h результат тот же.
327
27 октября 2014 года
UserNet2008
748 / / 03.04.2010
Как я понимаю , что
на XP - это работает
на 7 or 8 нет, думаю это связано с политикой привилегией в OS

~~Источник
en en ru
Обратите внимание на Размещение и совместимость CreateProcessWithLogonW внизу ссылки ru
290
27 октября 2014 года
Patr1ot
458 / / 09.02.2008
на xp вообще не проверял, меня интересует windows 7.
Про политики вряд ли на обоих компах с полными правами админа запускал. На обоих win7 максималка на одном 32x на другом 64x.
А может ли разрядность ос как то на работу функции влиять?
327
27 октября 2014 года
UserNet2008
748 / / 03.04.2010
Не знаю читаем первую ссылку en
Где напечатано
Requirements

Minimum supported client - Windows XP [desktop apps only]
Minimum supported server - Windows Server 2003 [desktop apps only]
Про 7 ни слова.
Цитата:
А может ли разрядность ос как то на работу функции влиять?


Да может, но без документации(CreateProcessWithLogonW для 7 х64) трудно говорить, что-да-как.

290
27 октября 2014 года
Patr1ot
458 / / 09.02.2008
Нашел вроде как вариант решения но не знаю где его прописать????

Впиши в stdafx #define _WIN32_WINNT 0x0500 перед всеми инклудами


Что такое stdafx??
327
27 октября 2014 года
UserNet2008
748 / / 03.04.2010
Visual C++ stdafx.h
Это Windows 2000 // определение ядра _WIN32_WINNT_WIN2K (0x0500)
Windows 7 // определение ядра _WIN32_WINNT_WIN7 (0x0601)
326
27 октября 2014 года
sadovoya
757 / / 19.11.2005
Когда-то была родственная тема. Материал к ней в msdn.
Эти дефайны майкрософтовские, может в билдере не быть. Но, похоже, для XP это сработало. Попробуйте тоже xp-шные дефайны:

 
Код:
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
Про stdafx.h в билдере забудьте. Это пребилды из студии. Если интересно - читайте.

Дефайны впишите перед инклудами в main.cpp. Думаю, достаточно. И поройтесь еще в настройках целевой платформы в билдере, наверняка там такое есть (сам им не пользуюсь).

Если все это не поможет, тогда ручная загрузка из dll. Ваша ф-ция находится в Advapi32.dll. Кстати, неспроста 32. Выясните где ее на 64-битной платформе искать. Есть ли вообще.. Надежда на режим совместимости с xp или как его там правильно зовут.
290
27 октября 2014 года
Patr1ot
458 / / 09.02.2008
Бред какой то. Есть компьютер А ( Windows 7 64x (Установлены все обновления) Максимальная ), и есть два компьютера B, C оба Windows 7 64x (у обоих установлены все обновления) Обе максимальные.

На компьютере B локально в моей программе функция CreateProcessWithLogonW не работает
На компьютере С локально в моей программе функция CreateProcessWithLogonW работает.

Когда цепляюсь через RDP с компа B на комп A, то на компе A функция CreateProcessWithLogonW в моей программе не работает.
Когда цепляюсь через RDP с компа С на комп А, то на компе А функция CreateProcessWithLogonW в моей программе работает.

Как так, что такого передается через RDP??
326
28 октября 2014 года
sadovoya
757 / / 19.11.2005
Надо с компом B разбираться в первую очередь. С RDP потом. Что на B дает GetLastError при локальном запуске? И менее интересно, но что дает GetLastError при пуске на А по RDP с B? И, что локально на А - работает или нет?
Куда кстати 32-битный комп исчез..
290
28 октября 2014 года
Patr1ot
458 / / 09.02.2008
GetLastError выдает ошибку 1326, не могу чет описание найти ее.
290
28 октября 2014 года
Patr1ot
458 / / 09.02.2008
Почему то на компе B не создается профиль пользователя при использование флага LOGON_WITH_PROFILE в CreateProcessWithLogonW
если профиль руками создаешь то все работает. Почему может не создаваться профиль? то есть не происходит логирования.
290
28 октября 2014 года
Patr1ot
458 / / 09.02.2008
А есть какие то другие методы программно залогинеться под другим пользователем чтобы профиль создался.
кроме psexec, runas.
20K
28 октября 2014 года
ellor!
198 / / 24.05.2012
Цитата: Patr1ot
GetLastError выдает ошибку 1326, не могу чет описание найти ее.


Все коды ошибок GetLastError с описанием есть в MSDN

Конкретно по 1326:
ERROR_LOGON_FAILURE
1326 (0x52E)
The user name or password is incorrect.

290
28 октября 2014 года
Patr1ot
458 / / 09.02.2008
Я уже нашел что за ошибка, трабла в том что если у пользователя например User1 нет профиля (новый пользователь), то при попытке запустить приложение от имени User1 вываливается с ошибкой 1326, если профиль есть то без проблем отрабатывает. То есть конкретно в логине и пароле ошибок нет.
327
01 ноября 2014 года
UserNet2008
748 / / 03.04.2010
Цитата: Patr1ot
Я уже нашел что за ошибка, трабла в том что если у пользователя например User1 нет профиля (новый пользователь), то при попытке запустить приложение от имени User1 вываливается с ошибкой 1326, если профиль есть то без проблем отрабатывает. То есть конкретно в логине и пароле ошибок нет.


Цитата:
По умолчанию, функция CreateProcessWithLogonW не загружает заданный профиль пользователя в ключ системного реестра HKEY_USERS. Это означает, что доступ к информации в ключе системного реестра HKEY_CURRENT_USER, не может достичь результатов совместимых с нормальным интерактивным входом в систему. Это является вашей ответственностью загрузить древо системного реестра пользователя в HKEY_USERS перед вызовом CreateProcessWithLogonW, используя, или LOGON_WITH_PROFILE, или вызывая функцию LoadUserProfile.

источник
P/S
По ходу CreateProcessWithLogonW должна работать с 7 - 8

Цитата:
To compile an application that uses this function, define _WIN32_WINNT as 0x0500 or later.
For more information, see Using the Windows Headers.


sorry - мой bag.

Хотел спросить версию C++ Builder and OS ?

326
01 ноября 2014 года
sadovoya
757 / / 19.11.2005
Думаю сперва надо создать пользователя вручную или программно (от админа сети или как-то в этом роде). Иначе проходной двор. Вряд ли система безопасности такие дыры предоставляет. Хотя хакеры по удаленному помошнику влезать умеют.

P.S. Для получения описания ошибки с переводом можно использовать примерно такую ф-цию (немного переделал из примера в MSDN - см. printError):

Код:
//С использованием материала http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx
//(изменил реализацию)
void printError(const char* msg) {
    DWORD eNum = GetLastError();
    const int BUF_SZ = 1024; //должно хватить
    char sysMsg[BUF_SZ];
    FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                   NULL, eNum,
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   sysMsg, BUF_SZ, NULL );
    sysMsg[strlen(sysMsg)-2] = '\0'; //затираем лишнии символы, обрывая нулем
    printf("\nВНИМАНИЕ: %s завершилась неудачно с ошибкой %lu (%s)", msg, eNum, sysMsg);
}
Похоже в оригинале перемудрили с парсером. Но главное - использование FormatMessage. Реализовать можно и лучше.

Можно еще так - с передачей буфера по ссылке и номера ошибки:

 
Код:
//описание системной ошибки по ее номеру
template< int BUF_SZ > //размер буфера для описания
void errorDescription(DWORD errorNum, char (&descr)[BUF_SZ]) {
    FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                   NULL, errorNum,
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   descr, BUF_SZ, NULL );
    descr[strlen(descr)-2] = '\0'; //затираем лишнии символы, обрывая нулем
}
Ее вызов тогда такой:

 
Код:
DWORD er = GetLastError();
char descEr[1024]; //с запасом
errorDescription(er, descEr);
Параметры шаблона и передача по ссылке массива позволяют так вызывать, размер (статического) массива в ф-ции будет известен. Об этих штуках можно почитать еще здесь:
1)С.Х. Дьюхэрст. «Скользкие места С++. Как избежать проблем при проектировании и компиляции ваших программ», 2006, «Совет 5».
2)http://forum.codenet.ru/q73579
290
01 ноября 2014 года
Patr1ot
458 / / 09.02.2008
Зарешал вопрос.
Первое нужно прогу запускать от имени администратора. ИМХО UAC.
Второе, при внесение данных в переменные ( значения Login, Password, command line ), нужно указывать L"Login " , L"Password"

Тогда все ок, и профиль создается.

P.S а подскажите что эта L дает перед текстом?
Без проблем работает Windows 7, 8 , Server 2008, Server 2012 Любой архитектуры
326
01 ноября 2014 года
sadovoya
757 / / 19.11.2005
L"строка в широких символах"
Это литерал для типа wchar_t - массива.

Буковка W в конце имени Api-функций недвусмысленно намекает, что ф-ция для работы c wchar_t.

CreateProcessWithLogonW. Для нее насколько знаю ansi-варианта нет.

Думал вы знаете..

А это литерал для wchar_t символа (например a):
L'a'; //одинарные кавычки

С русскими буквами могут быть проблемы. Исходник лучше делать в utf-8 тогда. См. здесь, например.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог