По умолчанию процессы, выходящие за пределы SQL Server, используют контекст безопасности учетной записи службы службы MSSQLSERVER (или MSSQL.InstanceName).При использовании этой настройки по умолчанию эта учетная запись службы должна иметь доступ на запись / изменение к папке, в которой находится файл (и, возможно, к самому файлу, если права доступа к файлу используют наследование).
Кроме того, вы можетеможет использовать олицетворение для изменения контекста безопасности внешнего процесса на контекст входа в систему (в SQL Server), выполняющего хранимую процедуру, но только в том случае, если имя входа является именем входа Windows.У имен входа SQL Server нет идентификатора безопасности, известного операционной системе, поэтому их контекст безопасности будет использовать значение по умолчанию, которое опять-таки соответствует учетной записи службы для основного процесса компонента SQL Server Database Engine.
using System.Security.Principal;
public class stuff
{
[SqlProcedure]
public static void PutFiles()
{
using (WindowsImpersonationContext __ImpersonationIdentity =
SqlContext.WindowsIdentity.Impersonate())
{
... {do stuff} ...
__ImpersonationIdentity.Undo();
}
}
}
Кроме того,Мартин Прикрыл прокомментировал этот ответ, отметив, что:
Сборка WinSCP .NET поддерживает олицетворение самостоятельно.См. Session.ExecutableProcessUserName и Session.ExecutableProcessPassword
Идея заключается в том (я предполагаю, хотя я не проверял):
using System.Security;
...
using (Session session = new Session())
{
session.ExecutableProcessUserName = "some_user_name";
SecureString _Password = new SecureString();
foreach (char _PasswordChar in "some_password")
{
_Password.AppendChar(_PasswordChar);
}
session.ExecutableProcessPassword = _Password;
... other session stuff...
session.Open(options);
...more stuff...
_Password.Dispose();
} /* using() */
В приведенном выше примере имя пользователя и пароль являются строковыми литералами, но на практике эти значения могут поступать из входных параметров в хранимую процедуру или даже из файла sqlservr.exe.Config
.Или, поскольку сборка имеет PERMISSION_SET
из UNSAFE
для ссылки на COM-объект, вы действительно можете получить значения из любого места, включая реестр и т. Д.
Так что, возможно, стоит попробовать.Я не уверен в сроках, когда это вступит в силу, поэтому попробуйте один вариант, и если он не работает, то попробуйте другой.
Обратите внимание, что, по крайней мере, разница между вариантамиis:
- Использование олицетворения через SQLCLR, как я предоставил для кода выше, позволяет только олицетворять вызывающий вход в систему (и только если этот вход в систему является входом в систему Windows), а не случайный вход в систему.Но для этого также не требуется пароль.
- Использование WinSCP для олицетворения допускает гибкость в том, какая учетная запись / олицетворяется, НО требует ввода пароля.
- WinSCPолицетворение позволит использовать олицетворение при входе в систему на SQL Server, так что это интересный вариант