我正在使用SQL Server FILESTREAM
,并且想与使用Windows网络共享的OpenSqlFilestream传输文件。
问题在于,当与另一个用户(而不是呼叫OpenSqlFilestream
)的服务器建立了另一连接时,OpenSqlFilestream
失败。
这是在Windows 10客户端上连接到相同域的SQL Server 2016。
复制步骤:
交互式用户为domain\myuser
在命令提示符下:
net use \\server\share /user:domain\otheruser password
运行以下代码:
dstHandle = OpenSqlFilestream("destination path", // Obtained with PathName()
SQL_FILESTREAM_WRITE,
0,
pTransactionContext_, // Obtained with GET_FILESTREAM_TRANSACTION_CONTEXT
transactionContextSize_, 0);
在OpenSqlFilestream
通话之后:
dstHandle
是INVALID_HANDLE_VALUE
GetLastError()
为5(访问被拒绝)。IRP_MJ_CREATE
事件,且“模拟”设置为domain\otheruser
。两种解决方法(在生产中实际上是不可能的):
如果在调用OpenSqlFilestream
之前,我使用返回的令牌使用“ domain \ myuser”(和密码)+ LogonUser
来调用ImpersonateLoggedOnUser
,则OpenSqlFilestream
成功。我不想管理密码...
如果我使用“ klist purge”清除kerberos缓存,则它最终将在一段时间(几分钟)后起作用。
我尝试过与ImpersonateSelf
,OpenProcessToken
,ImpersonateLoggedOnUser
等玩,但没有成功。
是否有一种方法可以告诉Windows使用当前用户,而不是使用网络资源的用户?