运行 来自 Jenkins 的 IIS Express 时 MSSQLLocalDB 登录失败
Login Failed for MSSQLLocalDB when running IIS Express from Jenkins
我目前使用 Jenkins 来构建我的解决方案,并 运行 针对我的网站进行一些 Selenium 测试。目前这指向另一台服务器上的硬编码 URL,但是,我已将其更改为在 Jenkins 服务器上的 IIS Express 实例中加载网站,从而允许 Selenium 测试 运行代码的当前版本。
流程如下:
- 提交发生在分支上,Bitbucket 让 Jenkins 知道,然后 Jenkins 开始行动。
- 解决方案已构建
- Selenium 测试已启动
- 在 C# 中创建一个进程指向本地 IISExpress.exe 并将网站代码加载到其中
- 我们在 Visual Studio 中有一个数据库项目,它使用 Dacpac 加载到 (localdb)\MSSQLLocalDB
- 新创建的数据库填充了所有需要的数据
- 然后个人测试运行
- 完成后数据库被删除
目前网站已成功加载到 IIS Express 中,数据库已创建并填充,但一旦网站尝试访问数据库,就会收到拒绝访问错误。
收到的错误是:
无法通过登录打开数据库 XXX 请求。登录失败。用户 'NT AUTHORITY\SYSTEM'.
登录失败
我在整个解决方案中添加了日志记录,发现当从 Jenkins 运行ning 时成功创建数据库的帐户是 'NT AUTHORITY\SYSTEM',然后是 运行连接 IIS Express 实例(从 Jenkins 启动)也是 'NT AUTHORITY\SYSTEM',所以我不完全确定为什么它可以创建数据库并填充它,但是如果通过 IIS Express 访问则失败。
连接设置为使用集成安全,并且在 运行 本地使用 Visual Studio 时 运行 正常。我试图不使用集成安全性而是创建一个 SQL 用户,但我收到同样的错误。
我们使用 NUnit 运行 selenium 测试,IIS Express 和数据库是从 SetUpFixture class 创建的,运行 在设置时和在拆卸时一次。
IIS Express 运行 使用以下代码:
string programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
_iisProcess = new Process();
_iisProcess.StartInfo.FileName = programFiles + @"\IIS Express\iisexpress.exe";
_iisProcess.StartInfo.Arguments = $"/path:\"{_applicationPath}\" /port:{_port}";
if (!_showConsoleWindow)
{
_iisProcess.StartInfo.CreateNoWindow = true;
_iisProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
_iisProcess.Start();
我知道这是有效的,因为一旦测试开始,我就可以远程访问 Jenkins 框并查看网站。
正在使用以下代码创建本地数据库:
string connectionString = $@"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;";
DacServices instance = new DacServices(connectionString);
string dacpacPath = Path.GetFullPath(
Path.Combine(
TestContext.CurrentContext.TestDirectory,
dacpacRelativePath
));
using (DacPackage dacpac = DacPackage.Load(dacpacPath))
{
instance.Deploy(dacpac, _databaseName, true,
new DacDeployOptions {
CreateNewDatabase = true,
IgnorePermissions = true,
IgnoreLoginSids = true,
IgnoreRoleMembership = true,
IgnoreUserSettingsObjects = true
});
}
我知道这是可行的,因为我可以查看用户 NT AUTHORITY\SYSTEM 的文件夹,并且可以看到数据库在那里。
由于 IIS Express 运行 由创建数据库的同一用户使用,因此我希望它在访问数据库时不会出现问题。我已将 Selenium 设置为在 运行 测试时截取一些屏幕截图,当网站尝试访问本地数据库时我收到的 2 个错误是:
- 管道的另一端没有进程
- 无法打开登录请求的数据库 XXX。登录失败。
通常 运行 的前几个测试会收到第一个错误,然后每个测试都会收到第二个错误。
有没有人以前遇到过这个问题或者可以提供任何我可以尝试解决的建议?
@BugFinder 已经解决了这个问题。
查看 LocalDB 的文档 here 我发现以下几点:
An instance of LocalDB owned by the built-in accounts such as NT
AUTHORITY\SYSTEM can have manageability issues due to windows file
system redirection. Instead use a normal windows account as the owner.
将此更改为 windows 帐户已使其按预期工作。
感谢您的帮助!
我目前使用 Jenkins 来构建我的解决方案,并 运行 针对我的网站进行一些 Selenium 测试。目前这指向另一台服务器上的硬编码 URL,但是,我已将其更改为在 Jenkins 服务器上的 IIS Express 实例中加载网站,从而允许 Selenium 测试 运行代码的当前版本。
流程如下:
- 提交发生在分支上,Bitbucket 让 Jenkins 知道,然后 Jenkins 开始行动。
- 解决方案已构建
- Selenium 测试已启动
- 在 C# 中创建一个进程指向本地 IISExpress.exe 并将网站代码加载到其中
- 我们在 Visual Studio 中有一个数据库项目,它使用 Dacpac 加载到 (localdb)\MSSQLLocalDB
- 新创建的数据库填充了所有需要的数据
- 然后个人测试运行
- 完成后数据库被删除
目前网站已成功加载到 IIS Express 中,数据库已创建并填充,但一旦网站尝试访问数据库,就会收到拒绝访问错误。
收到的错误是: 无法通过登录打开数据库 XXX 请求。登录失败。用户 'NT AUTHORITY\SYSTEM'.
登录失败我在整个解决方案中添加了日志记录,发现当从 Jenkins 运行ning 时成功创建数据库的帐户是 'NT AUTHORITY\SYSTEM',然后是 运行连接 IIS Express 实例(从 Jenkins 启动)也是 'NT AUTHORITY\SYSTEM',所以我不完全确定为什么它可以创建数据库并填充它,但是如果通过 IIS Express 访问则失败。
连接设置为使用集成安全,并且在 运行 本地使用 Visual Studio 时 运行 正常。我试图不使用集成安全性而是创建一个 SQL 用户,但我收到同样的错误。
我们使用 NUnit 运行 selenium 测试,IIS Express 和数据库是从 SetUpFixture class 创建的,运行 在设置时和在拆卸时一次。
IIS Express 运行 使用以下代码:
string programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
_iisProcess = new Process();
_iisProcess.StartInfo.FileName = programFiles + @"\IIS Express\iisexpress.exe";
_iisProcess.StartInfo.Arguments = $"/path:\"{_applicationPath}\" /port:{_port}";
if (!_showConsoleWindow)
{
_iisProcess.StartInfo.CreateNoWindow = true;
_iisProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
_iisProcess.Start();
我知道这是有效的,因为一旦测试开始,我就可以远程访问 Jenkins 框并查看网站。
正在使用以下代码创建本地数据库:
string connectionString = $@"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;";
DacServices instance = new DacServices(connectionString);
string dacpacPath = Path.GetFullPath(
Path.Combine(
TestContext.CurrentContext.TestDirectory,
dacpacRelativePath
));
using (DacPackage dacpac = DacPackage.Load(dacpacPath))
{
instance.Deploy(dacpac, _databaseName, true,
new DacDeployOptions {
CreateNewDatabase = true,
IgnorePermissions = true,
IgnoreLoginSids = true,
IgnoreRoleMembership = true,
IgnoreUserSettingsObjects = true
});
}
我知道这是可行的,因为我可以查看用户 NT AUTHORITY\SYSTEM 的文件夹,并且可以看到数据库在那里。
由于 IIS Express 运行 由创建数据库的同一用户使用,因此我希望它在访问数据库时不会出现问题。我已将 Selenium 设置为在 运行 测试时截取一些屏幕截图,当网站尝试访问本地数据库时我收到的 2 个错误是:
- 管道的另一端没有进程
- 无法打开登录请求的数据库 XXX。登录失败。
通常 运行 的前几个测试会收到第一个错误,然后每个测试都会收到第二个错误。
有没有人以前遇到过这个问题或者可以提供任何我可以尝试解决的建议?
@BugFinder 已经解决了这个问题。
查看 LocalDB 的文档 here 我发现以下几点:
An instance of LocalDB owned by the built-in accounts such as NT AUTHORITY\SYSTEM can have manageability issues due to windows file system redirection. Instead use a normal windows account as the owner.
将此更改为 windows 帐户已使其按预期工作。
感谢您的帮助!