sql-server - 连接到 SQL Server 需要使用显式凭据启动 CMD
问题描述
[用更多测试场景更新了我的查询]
我在四种情况下在 VBS 代码下运行。
连接字符串 1:添加了“用户 ID=YYDOMAIN\YYAccount;Password=YYPassword;” 并删除“集成安全 = SSPI”
connect.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;" _
"Initial Catalog=reportservertempdb;Data Source=10.10.10.10;Use Procedure for Prepare=1;" _
"Auto Translate=True;Packet Size=4096;Workstation ID=ServerHostName;Use Encryption for Data=False;" _
"Tag with column collation when possible=False;User ID=YYDOMAIN\YYAccount;Password=YYPassword;"
方案 1: “用户 YYDOMAIN\YYAccount 登录失败”“80040E4D”“Microsoft OLE DB Provider for SQL Server”
- 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
- 打开 CMD
- CScript.exe 并按 Enter
- 收到错误“用户 YYDOMAIN\YYAccount 登录失败”“80040E4D”“Microsoft OLE DB Provider for SQL Server”
场景 1 的命令行输出如下:
C:\Users\yyram>whoami
YYDOMAIN\yyram
C:\Users\yyram>CScript.exe "C:\Temp\Sql_Connect.vbs"
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
C:\Temp\Sql_Connect.vbs(8, 1) Microsoft OLE DB Provider for SQL Server: Login failed for user 'YYDOMAIN\YYAccount'.
C:\Users\yyram
方案 2: “用户 YYDOMAIN\YYAccount 登录失败”“80040E4D”“Microsoft OLE DB Provider for SQL Server”
- 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
- 打开 CMD '以不同用户身份运行'并提供详细信息为'用户:YYDOMAIN\YYAccount & Pass:YYPassword'(仅供参考:在 SQL 查询中使用相同的用户详细信息连接 SQLDB)
- CScript.exe 并按 Enter
- 收到错误“用户 YYDOMAIN\YYAccount 登录失败”“80040E4D”“Microsoft OLE DB Provider for SQL Server”
场景 2 的命令行输出如下:
C:\Users\yyram>whoami
YYDOMAIN\YYAccount
C:\Users\yyram>CScript.exe "C:\Temp\Sql_Connect.vbs"
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
C:\Temp\Sql_Connect.vbs(8, 1) Microsoft OLE DB Provider for SQL Server: Login failed for user 'YYDOMAIN\YYAccount'.
C:\Users\yyram>
连接字符串 2:删除“用户 ID=YYDOMAIN\YYAccount;Password=YYPassword;” 并添加了“集成安全 = SSPI”
connect.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;" _
"Initial Catalog=reportservertempdb;Data Source=10.10.10.10;Use Procedure for Prepare=1;" _
"Auto Translate=True;Packet Size=4096;Workstation ID=ServerHostName;Use Encryption for Data=False;" _
"Tag with column collation when possible=False;Integrated Security=SSPI;"
场景 3: “用户 YYDOMAIN\yyram 登录失败”“80040E4D”“Microsoft OLE DB Provider for SQL Server”
- 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
- 打开 CMD
- CScript.exe 并按 Enter
- 收到错误“用户 YYDOMAIN\yyram 登录失败”“80040E4D”“Microsoft OLE DB Provider for SQL Server”
场景 3 的命令行输出如下:
C:\Users\yyram>whoami
YYDOMAIN\yyram
C:\Users\yyram>CScript.exe "C:\Temp\Sql_Connect.vbs"
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
C:\Temp\Sql_Connect.vbs(8, 1) Microsoft OLE DB Provider for SQL Server: Login failed for user 'YYDOMAIN\yyram'.
C:\Users\yyram>
场景四:脚本执行成功
- 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
- 打开 CMD '以不同用户身份运行'并提供详细信息为'用户:YYDOMAIN\YYAccount & Pass:YYPassword'(仅供参考:在 SQL 查询中使用相同的用户详细信息连接 SQLDB)
- CScript.exe 并按 Enter
- 报告已成功生成“C:\temp\test.csv”。
场景 4 的命令行输出如下:
C:\Users\yyram>whoami
YYDOMAIN\YYAccount
C:\Users\yyram>CScript.exe "C:\Temp\Sql_Connect.vbs"
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
C:\Users\yyram>
那么,有没有办法提供另一个 Windows 身份验证详细信息而不是登录用户详细信息以在 VBScript 上运行?
VBScript 主要代码如下:
Dim connect, sql, resultSet, pth, txt
Set ObjFSO = CreateObject("Scripting.FileSystemObject")
Set connect = CreateObject("ADODB.Connection")
connect.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;" _
"User ID=YYDOMAIN\YYAccount;Password=YYPassword;Initial Catalog=reportservertempdb;Auto Translate=True;" _
"Data Source=10.10.10.10;Use Procedure for Prepare=1;Packet Size=4096;Workstation ID=ServerHostName;" _
"Use Encryption for Data=False;Tag with column collation when possible=False;Trusted_Connection=True;"
connect.Open
sql="select sql query"
Set resultSet = connect.Execute(sql)
pth = "C:\temp\test.csv"
Set txt = ObjFSO.CreateTextFile(pth, True)
On Error Resume Next
resultSet.MoveFirst
Do While Not resultSet.eof
txt.WriteLine(resultSet(0) & "," & resultSet(1))
resultSet.MoveNext
Loop
resultSet.Close
connect.Close
Set connect = Nothing
解决方案
我使用两个批处理文件。
RUNAS_callVBSScript.cmd
RUNAS /savecred /user:Domain\User callVBSScript.cmd
调用VBSScript.cmd
.\VBScript.vbs
我必须在第一次运行时输入密码,如果我更改密码。
推荐阅读
- java - isDisplayed() 的替代方案,因为它在 safari 12 中/从 safari 12 中不可用
- javascript - SublimeText 错误消息:'NameError: name 'console' is not defined' 尝试在 JavaScript 中将数组打印到控制台时
- java - 使用Java根据条件返回不同类型的对象
- mongodb - $match 查询不适用于 mongodb 中的查找数组
- nginx - 在自己的域上重写和“托管”网址
- android - 为什么jw播放器不会全屏?
- android - 如何解决版本冲突的依赖问题?
- sql - 检查任何三个连续交易是否超过指定金额
- ruby - 我正在使用 MediaRecorder API 录制语音,为什么块小于实际大小?
- python - Keras mode.fit - 为什么每次新运行都会产生不同的结果(准确度和损失)?