首页 > 解决方案 > 连接到 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”

  1. 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
  2. 打开 CMD
  3. CScript.exe 并按 Enter
  4. 收到错误“用户 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”

  1. 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
  2. 打开 CMD '以不同用户身份运行'并提供详细信息为'用户:YYDOMAIN\YYAccount & Pass:YYPassword'(仅供参考:在 SQL 查询中使用相同的用户详细信息连接 SQLDB)
  3. CScript.exe 并按 Enter
  4. 收到错误“用户 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”

  1. 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
  2. 打开 CMD
  3. CScript.exe 并按 Enter
  4. 收到错误“用户 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>

场景四:脚本执行成功

  1. 我用我的登录名“YYdomian\yyram”登录了加入域“yydomain.com”的本地电脑
  2. 打开 CMD '以不同用户身份运行'并提供详细信息为'用户:YYDOMAIN\YYAccount & Pass:YYPassword'(仅供参考:在 SQL 查询中使用相同的用户详细信息连接 SQLDB)
  3. CScript.exe 并按 Enter
  4. 报告已成功生成“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

标签: sql-servervbscript

解决方案


我使用两个批处理文件。

RUNAS_callVBSScript.cmd

RUNAS /savecred /user:Domain\User callVBSScript.cmd

调用VBSScript.cmd

.\VBScript.vbs

我必须在第一次运行时输入密码,如果我更改密码。


推荐阅读