Как заставить OpenSqlFilestream использовать текущего пользователя Windows? - PullRequest
0 голосов
/ 05 июня 2019

Я использую SQL Server FILESTREAM и хочу передать файлы с помощью OpenSqlFilestream , который использует сетевые ресурсы Windows.

Проблема в том, что OpenSqlFilestream не удается, если к серверу было установлено другое соединение с другим пользователем, чем тот, который вызывает OpenSqlFilestream.

Это на клиенте Windows 10, подключающемся к SQL Server 2016 как в одном домене.

Репро шаги:

  1. Интерактивный пользователь - domain\myuser

  2. В командной строке:

    net use \\server\share /user:domain\otheruser password
    
  3. Запустите этот код:

    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 использовать текущего пользователя вместо того, который использовал сетевой ресурс?

...