Хорошо, я рассмотрел почти каждый вопрос, руководство по PHP и опубликовал эту проблему по всему Интернету. Кажется, ничто не поможет.
Я работаю над проектом, который требует от меня аутентификации (или, по крайней мере, возможности поиска UID) различных пользователей в моей организации в Active Directory. Для подключения и проверки подлинности они предоставили мне файл dll, в котором есть функции, необходимые для проверки подлинности. Мне нужно использовать этот DLL-файл и функции, чтобы заставить мое приложение работать.
Ниже приведены различные вещи, которые я пробовал до сих пор, а также ошибки для каждого из них.
Я пытался с помощью
dl('filename.dll');
и получил ошибку
Call to undefined function dl() in C:\xampp\htdocs\OOP_curater\index.php on line 16
Осмотревшись, я наткнулся этот а также этот Я понял, что больше не поддерживается.
Затем я попытался поместить dll в C: \ xampp \ php \ ext и добавить строку расширения в php.ini. (Просто так) перезапуск php дал мне сообщение об ошибке, в котором говорилось, что это недопустимое расширение PHP.
Затем я попытался с помощью
$action = new COM("ProjectName.FunctionName") or die ("Could not initialise MS Word object.");
и получил следующую ошибку
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `ProjectName.FunctionName': Invalid syntax ' in C:\xampp\htdocs\OOP_curater\index.php:3 Stack trace: #0 C:\xampp\htdocs\OOP_curater\index.php(3): com->com('FBA_Provider1.a...') #1 {main} thrown in C:\xampp\htdocs\OOP_curater\index.php on line 3
Оглядевшись, я получил ссылки, похожие на этот. Я понял, что мне нужно зарегистрировать DLL, так что попробовал
regsvr32 C:\xampp\htdocs\OOP_curater\filename.dll
и получил ошибку
DllRegisterServer entry point was not found
Я тогда попробовал
regsvr32 /i /n C:\xampp\htdocs\OOP_curater\filename.dll
и получил ошибку «Установка DLL не найдена».
Я должен признать, я все еще не уверен, правильно ли я понял часть (Projectname.FunctionName), я действительно не мог понять большую часть документации по этой теме.
Затем я попробовал следующий код
$comobj = new DOTNET("projectname", "projectname.function");
и получил эту ошибку
Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object [CreateInstance] [0x80070002] The system cannot find the file specified. ' in C:\xampp\htdocs\OOP_curater\index.php:21 Stack trace: #0 C:\xampp\htdocs\OOP_curater\index.php(21): dotnet->dotnet('ProjectName', 'Function') #1 {main} thrown in C:\xampp\htdocs\OOP_curater\index.php on line 21
Теперь у меня есть следующие вопросы относительно загрузки DLL для PHP
Каков наилучший способ загрузить DLL, где:
а. Это не совсем функция PHP
б. Источник недоступен
с. Это не может быть зарегистрировано (при условии, что из-за ошибок выше)
д. Он не может быть перекомпилирован для расширения / регистрации PHP
Несколько вещей на заметку
У меня очень мало знаний о .net и Active Directory, поэтому я нахожу это еще сложнее. Также учитывая длину вопроса, надеюсь, я не упустил ничего важного. Дайте мне знать, если вам нужно больше информации.
РЕДАКТИРОВАТЬ
Я был в состоянии декомпилировать DLL с помощью рефлектор, и теперь иметь исходный код и доступ к Microsoft Visual Studio для приложений 2.0. Если вам нужно, чтобы я внес изменения в саму DLL.
Также я попытался собрать его с опцией «make visible to com», но все еще получал ту же ошибку с regsvr 32 и regasm.
Исходя из вашего описания ваших требований, я не уверен, что вы поступите правильно. Я подозреваю, что вы сбились с пути, когда «они» предоставили вам файл DLL, как будто вы создаете приложение для настольного компьютера (или ASP.NET?).
Насколько я понимаю, вам просто нужно аутентифицировать пользователей вашего PHP-приложения через Active Directory (предположительно, чтобы разрешить проверку авторизации в вашем приложении). С IIS это стандартная функция и ее легко активировать. Увидеть мой ответ на другой вопрос здесь так о том, как это сделать.
Если вам нужно выполнить какие-либо запросы к AD (например, получить UID пользователя, электронную почту и т. Д.), Вы можете использовать встроенный Функции LDAP.
Быстрый и грязный пример:
$server ='ldaps://server_hostname'; // could also use 'ldap://' for non-encrypted connection.
$username = 'username'; // should be a restricted 'service account' to be used only by this app.
$password = '';
$base_dn = '';
$search_filter = 'cn=' . $_SERVER['AUTH_USER']; // search based on username provided by IIS single-sign on.
$attributes = ['mail', 'sn', 'cn']; // array of fields you want AD to provide.
$ldap = ldap_connect($server);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // generally needed with AD.
ldap_bind($ldap, $username, $password);
$search = ldap_search($ldap, $base_dn, $search_filter, $attributes);
$data = ldap_get_entries($ldap, $search);
Если совпадение найдено $data
будет массив указанных атрибутов.
Это не дает прямого ответа на поставленный вопрос, но решает вашу проблему.
Использовать adLDAP (http://adldap.sourceforge.net/) в PHP это все для вас. Вам не нужна внешняя DLL или ваша собственная.
Образец:
$adldap = new adLDAP();
$aUserInfo = getLDAPUserInfo($adldap, $username);
if ($aUserInfo) {
if (strlen($aUserInfo['mail']) > 0) {
$email = $aUserInfo['mail'];
if ($email) {
$userRow['email'] = $email;
}
}
}
или же
$adldap = new adLDAP();
$authUser = $adldap->user()->authenticate($username, $password);
if ($authUser == true) {
if ($adldap->user()->inGroup($username,'ServerAdmins')) {
// This user is in server admins
}
}
Запустите командную строку от имени администратора и попробуйте зарегистрировать свою DLL в Windows.
Выполните следующие шаги:
Я надеюсь, что это может решить вашу проблему.