Ошибка входа в собственный клиент MS SQL при подключении через PHP - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть сервер Windows 2008 R2 Datacenter с IIS 7.5, MS SQL 2012 Express, использующий PHP 5.6, пытающийся подключиться к созданной мной базе данных testDB через проверку подлинности Windows, но мне не удается это сделать.

Вот мой PHP, который я использую для подключения к своему SQL Server \ Instance:

<?php

$serverName = "nmc-intranet\intranetsql";
$connectionInfo = array("Database"=>"testDB", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if ( $conn ) {
echo "Connection successful.<br />";
} else {
    echo "Connection failed.<br />";
    die( print_r( sqlsrv_errors(), true));
}

?>

Когда я запускаю это, я получаю:

Ошибка подключения.Массив ([0] => Массив ([0] => 28000 [SQLSTATE] => 28000 1 => 18456 [код] => 18456 2 => [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Ошибка входа для пользователя «jaj». [Message] => [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Ошибка входа для пользователя «jaj».) 1 => Массив ([0] => 28000 [SQLSTATE] => 28000 1 => 18456 [код] => 18456 2 => [Microsoft] [SQL ServerСобственный клиент 11.0] [SQL Server] Ошибка входа для пользователя «jaj». [Message] => [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Ошибка входа для пользователя «jaj».))

В MS SQL я добавил имя пользователя в Security> Logins и отобразил testDB и дал схему dbo.У пользователя также есть sysadmin Server Role.Я могу подключиться к testDB через CLI SQLCMD /S nmc-intranet\intranetSQL /E /d testDB под именем пользователя.Я также могу подключиться к серверу \ экземпляру через удаленный сеанс SSMS, поэтому я считаю, что свойства удаленного подключения правильные.Я проверил шаги, упомянутые в ответе, найденном здесь .

Для IIS я пытался установить соединение разными способами, но также безуспешно.Таким образом, я предполагал, что именно здесь моя проблема заключается в ошибке входа в систему SQL.Я изменил строку подключения через диспетчер IIS под узлом NMC-Intranet, а также узлом веб-сайта по умолчанию, и произошел сбой.Моя текущая строка подключения в web.config - это то, что было там по умолчанию после внесения изменений в IIS Manger, и выглядит следующим образом:

<connectionStrings>
    <remove name="LocalSqlServer" />
    <add connectionString="Server=nmc-intranet;Database=testDB;Integrated Security=true" name="LocalSqlServer" providerName="System.Data.SqlClient" />
</connectionStrings>

Я попытался изменить ее на следующее, что я нашел здесь и до сих пор не увенчались успехом.

<connectionStrings>
    <add connectionString="Server=.\SQLEXPRESS;Database=testDB;User ID=username;Password=password" name="LocalSqlServer" providerName="System.Data.SqlClient" />
</connectionStrings>

В IIS DefaultAppPool я также попытался изменить идентификатор модели процесса на имя пользователя / пароль.Я читал об аутентификации Kerberos здесь , но когда доступ к интрасети включен, он запрашивает у пользователя имя пользователя / пароль даже для просмотра домашней страницы.

Надеюсь, я спросил этовопрос правильно, как найдено здесь , так как предыдущие вопросы не были приняты.Я провел много исследований, но я не знаю, чего мне не хватает, и я сделал так много изменений и отменил их, потому что они не работали. Я просто надеюсь, что мне понадобится кое-что еще попробовать.Скорее всего, я что-то неправильно истолковал, так как у меня нет полного понимания того, как нужно устанавливать соединение, и я пропустил шаг или пропустил некоторую информацию.

Я не профессионал, просто пытаюсь собрать все этовместе из Интернета, заставьте его работать и, надеюсь, чему-нибудь научитесь.

Конец игры Я хочу, чтобы пользователи входили в Интранет через AD и загружали файлы, создавали свои собственные сообщения, создавали каталоги, которыеможно управлять через интранет, возможно иметь IM (?), и действительно просто опыт обучения.

Спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Решение:

Если вы хотите подключиться к SQL Server с использованием аутентификации Windows, удалите параметры подключения UID и PWD.При использовании этих параметров драйвер PHP пытается подключиться с использованием аутентификации SQL Server (я предполагаю, что UID является значением для *1008*).

<?php
$serverName = "nmc-intranet\intranetsql";
$connectionInfo = array(
    "Database"=>"testDB"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    echo "Connection failed.<br />";
    die( print_r( sqlsrv_errors(), true));
} else {
    echo "Connection successful.<br />";
}
?>

Пояснения:

Драйверы Microsoft для PHP для SQL Server могут подключаться к SQL Server, используя Аутентификация Windows или Аутентификация SQL Server .При использовании проверки подлинности Windows для подключения к серверу используется идентификация процесса или идентификация потока веб-сервера (если веб-сервер использует олицетворение), а не идентификация конечного пользователя.Я использую этот скрипт для получения дополнительной информации:

<?php
# ---------------------------------------
# SQL Server authentication
# ---------------------------------------
echo "SQL Server authentication"."</br>";
$server = 'server\instance,port';
$cinfo = array(
    "Database"=>'master',
    "UID"=>'login',
    "PWD"=>'password'
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}
$sql = 
    "SELECT 'SUSER_SNAME' AS [NAME], CONVERT(nvarchar(128), SUSER_SNAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'SUSER_NAME' AS [NAME], CONVERT(nvarchar(128), SUSER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_NAME' AS [NAME], CONVERT(nvarchar(128), USER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_ID' AS [NAME], CONVERT(nvarchar(128), USER_ID()) AS [VALUE]";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['NAME'].": ".$row['VALUE']."</br>";
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);


# ---------------------------------------
# Windows authentication
# ---------------------------------------
echo "Windows authentication"."</br>";
$server = 'server\instance,port';
$cinfo = array(
    "Database"=>'master'
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}
$sql = 
    "SELECT 'SUSER_SNAME' AS [NAME], CONVERT(nvarchar(128), SUSER_SNAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'SUSER_NAME' AS [NAME], CONVERT(nvarchar(128), SUSER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_NAME' AS [NAME], CONVERT(nvarchar(128), USER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_ID' AS [NAME], CONVERT(nvarchar(128), USER_ID()) AS [VALUE]";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['NAME'].": ".$row['VALUE']."</br>";
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...