Я использую SQL Server FILESTREAM
и хочу передать файлы с помощью OpenSqlFilestream , который использует сетевые ресурсы Windows.
Проблема в том, что 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
is INVALID_HANDLE_VALUE
GetLastError()
равно 5 (доступ запрещен).
- На сервере Process Monitor регистрирует событие
IRP_MJ_CREATE
с «Олицетворением», установленным в domain\otheruser
.
Два обходных пути (на практике это невозможно):
Если перед вызовом OpenSqlFilestream
я позвоню LogonUser
с "доменом \ myuser" (и паролем) + ImpersonateLoggedOnUser
с возвращенным токеном, OpenSqlFilestream
завершится успешно. Я не хочу управлять паролями ...
Если я удаляю кеш Kerberos с помощью «klist purge», он через некоторое время (минуты) будет работать.
Я пытался играть с ImpersonateSelf
, OpenProcessToken
, ImpersonateLoggedOnUser
и т. Д., Но безуспешно.
Есть ли способ указать Windows использовать текущего пользователя вместо того, который использовал сетевой ресурс?