嗨,
我猜这是一个权限问题。首先通过在你的 php 脚本的开头插入这个来检查这个。
echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
选择指定的用户并转到 IIS 管理器 - 应用程序池。
在那里您更改相应的用户并从 ApplicationPoolIdentity -> 高级设置更改。
您可以在这里看到我通过更改 ASP.NET 1.1 的默认值来通过 IIS 7.5 访问某个 ODBC DNS 所做的更改:
您可以使用 SQL-Server-Authentication 或 Windows-Authentication。
然后您可以使用本地/系统。这将使您的应用程序在 NT AUTHORITY\SYSTEM 下运行,默认情况下这是 sql 数据库的现有登录名,或者将其更改为您喜欢的登录名。这是简单的方法,但自然也必须考虑安全性。这需要进一步的步骤。这只是为了让它工作。
在此处查看 SQL 服务器端权限作为图像。
还有一些其他的先决条件,可能很重要:
检查 phpinfo() 中的 PDO 支持:
“sqlsrv”应该在“启用”列表中。
连接字符串:sqlsrv:Server=xxxxxxxxxxx;Database=cTest
IIS 7.0 中的 PHP 管理器转到 PHP 管理器 ->PHP 扩展 ->启用禁用扩展 ->禁用列表 启用您的 PHP_PDO_SQLSRV_5(xx)_nts.dll。
它可能 - 结合您使用的 php 版本 - 取决于 Microsoft 驱动程序:3.1 到 2.0 dll 文件
见https://msdn.microsoft.com/en-us/library/cc296170%28v=sql.105%29.aspx
而且 - 如果你必须通过防火墙 - 打开端口 1433
但我想这些先决条件都在您的环境中得到满足,因为如果您没有得到 php 错误输出。 IIS 只是因为权限问题而挂起。
好的 - 我阅读了您的修正案 1
首先是从你的 php 脚本中指示用户的问题。
exec('whoami');
请告诉我,如果你愿意的话。我需要它来做进一步的解释。
好的 - 我阅读了您的修正案 2
NT_AUTHORITY/iusr - 啊,好吧 - 他属于 IIS_IUSRS 组。这有点奇怪,IIS 7.5 在 IUSR 之下运行。但是,好的,让我反思一下。 ...
就是这个
我从来没有为 IUSR 这样做过,但让我们尝试一下。记住所有回滚步骤。
首先进入 IIS 管理器,单击应用程序池,然后将指定右侧的屏幕截图发送给我(“用户”)。通常它是 ASP.NET 1.1。而不是IUSR。这是非常不安全的!
我需要屏幕截图,因为您的应用程序池身份设置中似乎设置了一些非常奇怪的东西。
在此处查看我关于尝试将 IUSR 设置为身份的消息:
我必须反思。请稍等片刻。有一点很奇怪。
好的 - 我看到了你的截图和修改 3
IIS 使用 IUSR 因为 PDO 权限 - 这没关系。
所以我们从 SQL Server 权限的另一端来做:
1 将“NT AUTHORITY\IUSR”用户添加到 SQL 的安全性
2 将服务器角色设置为public或DBcreator,并设置用户也可以访问的数据库的映射(db_owner的成员)
你知道在哪里制作吗?
如果没有 - 我们可以在 DefaultAppPool 设置中尝试一个非常简单的事情。我现在离开办公室两个小时。
您可以先尝试一下。如果您的数据库权限包括通常包含的 NT_AUTORITY/SYSTEM,则它可以运行。
您在 DefaultAppPool 的高级设置中进行了设置
如果 SQL-Server 端具有这些权限,这可以简单地使其运行 - 我猜是这样。
好的 - 我读了你的修正案 4
现在将您的连接字符串用户名和密码设置为 NULL
$conn = new PDO("sqlsrv:Server=$serverName;Database=CTest", NULL, NULL);
并在 SQL 管理中进行更改:
我尝试了 SQL EXPRESS:
echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
$serverName = "RWTH-SAP1\SQLEXPRESS,1433";
try {
$conn = new PDO("sqlsrv:Server=$serverName\SQLEXPRESS;Database=master",NULL, NULL);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
echo $e;
die("Error connecting to SQL Server");
}
echo "Connected to SQL Server\n";
我在 SQL Server 2008 R2 上试用过
<?php
echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
try {
$conn = new PDO("sqlsrv:Server=RWTH-SAP1\RWTH-SAP1,1433;Database=ECC", NULL, NULL);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected to SQL Server\n";
} catch (PDOException $e) {
echo $e;
die("Error connecting to SQL Server");
}
?>
它在我的环境中使用我们尝试过的设置。也可以用对应的连接字符串测试一下吗?
$conn = new PDO("sqlsrv:Server=$serverName\xxxxxxxx;Database=xxxx",NULL, NULL);
<?php
echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
try {
$conn = new PDO("sqlsrv:Server=RWTH-SAP1\SQLEXPRESS;Database=", NULL, NULL);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected to SQL Server<br>";
$sqlDB = "CREATE DATABASE testStackoverflow";
$connSQL = $conn->exec($sqlDB);
echo "Database Created<br>";
$conn->query("use testStackoverflow");
// sql to create table
$sql = "CREATE TABLE MyGuests (
firstname VARCHAR(30) ,
lastname VARCHAR(30) ,
email VARCHAR(50) ,
reg_date TIMESTAMP
);";
// use exec() because no results are returned
$conn->exec($sql);
echo "Table MyGuests created successfully";
}
catch (PDOException $e) {
echo $e;
die("Error connecting to SQL Server");
}
$conn = null;
?>
调试也可以。所以所有 PDO 的东西都能正常工作。
同样重要的是,您可以更改您的 PHP APP_POOL_ID,就我而言:
_SERVER["APP_POOL_ID"] ASP.NET 1.1
这里:
_SERVER["APP_POOL_CONFIG"] C:\inetpub\temp\apppools\ASP.NET 1.1\ASP.NET 1.1.config
最好的问候
Axel Arnold Bangert - 2016 年黑措根拉特