- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建一个程序集文件,以便 get 文件和 put 文件可以作为存储过程从 SQL Server 中调用。下面是放置文件的方法。当我传递 SqlBoolean DeleteLocalFolder=true
时,WinSCP 出错并显示以下错误消息:
Error: WinSCP.SessionRemoteException: Error deleting file System Error. Code: 5
[SqlProcedure]
public static void PutFiles(SqlString HostName, SqlString UserName, SqlString Password,
SqlString SshHostKeyFingerprint, SqlString SshPrivateKeyPath,
SqlString SshPrivateKeyPassphrase, SqlString LocalFolderPath,
SqlString RemoteFolderPath,SqlBoolean DeleteLocalFolder,
SqlString FileMask, out SqlString strMessage)
{
// Declare Variables to hold the input parameter values
string hostName = HostName.Value;
string userName = UserName.Value;
string password = Password.Value;
string sshFingerPrint = SshHostKeyFingerprint.Value;
string sshPrivateKey = SshPrivateKeyPath.Value;
string sshPassPhrase = SshPrivateKeyPassphrase.Value;
bool delateLocalFolder = DeleteLocalFolder.Value;
//Local Directory
DirectoryInfo dir = new DirectoryInfo(LocalFolderPath.Value);
string folderName = dir.Name;
//Begin connection to SFTP **Always uses default SFTP port
try
{
string FtpFolderPath = RemoteFolderPath.Value;
SessionOptions options = new SessionOptions()
{
Protocol = Protocol.Sftp,
HostName = hostName,
UserName = userName,
Password = password,
SshHostKeyFingerprint = sshFingerPrint,
SshPrivateKeyPath = sshPrivateKey,
SshPrivateKeyPassphrase = sshPassPhrase
};
//Open the Remote session
using (Session session = new Session())
{
session.ExecutablePath = ExecutablePath+"WinSCP.exe";
session.SessionLogPath = ExecutablePath+"WinscpLog.log";
session.DisableVersionCheck = true;
session.Open(options);
session.ExecutableProcessUserName = "username to log into the sql server instance";
SecureString _Password = new SecureString();
foreach (char _PasswordChar in "password to log in sql instance")
{
_Password.AppendChar(_PasswordChar);
}
session.ExecutableProcessPassword = _Password;
// Upload files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
transferOptions.FileMask = FileMask.Value;
TransferOperationResult transferoperationalResult;
transferoperationalResult = session.PutFiles(LocalFolderPath.Value, FtpFolderPath, false, transferOptions);
transferoperationalResult.Check();
if (transferoperationalResult.IsSuccess)
{
if (dir.Exists == true)
{
string sourcePath = FtpFolderPath + folderName + "//";
session.MoveFile(sourcePath + "*.*", FtpFolderPath);
session.RemoveFiles(sourcePath);
}
}
}
strMessage = "Upload of files successful";
}
catch (Exception e)
{
//Console.WriteLine("Error: {0}", e);
strMessage = "Error: "+ e;
}
}
我在 SSIS 脚本任务中编写了自定义代码并调用了 Session.PutFiles
method通过传递参数 bool remove = true
。它可以正常工作。谁能解释为什么它只在自定义程序集中出错?
最佳答案
默认情况下,到达 SQL Server 外部的进程使用 MSSQLSERVER(或 MSSQL.InstanceName)服务的服务帐户的安全上下文。使用此默认设置时,此服务帐户需要对文件所在的文件夹具有写入/修改权限(如果文件权限使用继承,则可能对文件本身具有写入/修改权限)。
或者,您可以使用模拟将外部进程的安全上下文更改为执行存储过程的登录(在 SQL Server 中)的安全上下文,但前提是登录是 Windows 登录。 SQL Server 登录没有操作系统已知的 SID,因此它们的安全上下文将使用默认值,这同样是主 SQL Server 数据库引擎进程的服务帐户。
using System.Security.Principal;
public class stuff
{
[SqlProcedure]
public static void PutFiles()
{
using (WindowsImpersonationContext __ImpersonationIdentity =
SqlContext.WindowsIdentity.Impersonate())
{
... {do stuff} ...
__ImpersonationIdentity.Undo();
}
}
}
此外,Martin Prikryl 对此答案发表评论时提到:
WinSCP .NET assembly supports impersonation on its own. See Session.ExecutableProcessUserName and 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
文件。或者由于 Assembly 有一个 UNSAFE
的 PERMISSION_SET
以便引用 COM 对象,您实际上可以从任何地方获取值,包括注册表等。
所以也许这是值得尝试的事情。我不确定什么时候生效,所以尝试一个选项,如果它不起作用,然后尝试另一个。
请注意,至少,选项之间的区别是:
关于c# - 从 SQLCLR 调用时,带有 Remove=true 的 WinSCP Session.PutFiles 获取 "Error deleting file System Error. Code: 5"但在 SSIS 脚本任务中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393447/
我是 React Native 的新手,正在尝试为慈善机构创建一个应用程序。 我在尝试将相机拍摄的图像存储在 Firebase 存储中时遇到问题。 代码片段如下,查看控制台日志,一切看起来都如我所料,
pConnect->SetCurrentDirectory( "C:\\FilesToSendToServer" ); //Need this set on client, i believe cur
Nifi的新手! 我想知道 nifi 是否有办法使用诸如“PutFile”之类的处理器并将其写入一个文件(将数据附加到此文件,或覆盖此文件中的数据)-而不是创建多个不同的文件?是否需要使用另一个处理器
我正在尝试使用 Dropbox API 从 ListView 上传文件。我的代码是: File file = new File(mFileMag.getCurrentDir() + "/" + it
FTP server and client (C windows) 使用 UDP 套接字。 服务器使用 CFtpConnection::PutFile 将文件放在客户端上 一个大文件需要几分钟时间,因
背景 我有一个使用 FetchFile 的工作流处理器、一些中间处理器(例如 RouteOnAttribute 、 HashContent 等),然后是 PutFile处理器。 在整个过程中,内容没有
使用cfftp上传文件时,如何判断文件是否已经存在并重命名? cffile 标签有一个 makeunique 属性,这使得这个过程非常简单。谢谢。 20 年 8 月 2 日更新: 这是我的 cfm。
我尝试使用 Node.js 上传文件,但无法创建目录。请建议我的代码有什么问题: var Client = require('ssh2-sftp-client'); var sftp = new Cl
我正在使用 Cloud Storage for Firebase。我不太清楚如何使用字节数组或使用文件以最快的方式上传图像文件 try { Uri uri = Uri.p
我正在实现 WOPI 服务器以尝试与 Office Online 集成。当 WOPI 客户端调用 PutFile 方法(保存文件)时,它发送一个空请求(req.body.length === 0)。这
我正在使用 Laravel 5.4 并想上传一个文件(我们称之为“lorem.ext”)到存储目录(storage/app/)“path/to/file”,文件名唯一。 为此,我想使用 Storage
我正在开发一个 API,用户可以发送一个文件 url 以将其下载到与用户名相同的特定文件夹。 首先,我向名为 user 的文件系统配置添加了新的磁盘选项,其中包含与经过身份验证的用户用户名同名的特定目
我尝试将本地镜像从手机保存到 Firebase 存储,但收到以下错误。 Permission Denial: reading com.google.android.apps.photos.conten
我尝试将本地镜像从手机保存到 Firebase 存储,但收到以下错误。 Permission Denial: reading com.google.android.apps.photos.conten
string msg = "Writing to file."; byte[] data = System.Text.Encoding.Default.GetBytes(msg); System.IO
以下是我尝试上传文件的两种方式: 1. getURLOfPhoto(assetURL: imagesDictionary[String(whichProfileImage)]! , completio
我正在创建一个程序集文件,以便 get 文件和 put 文件可以作为存储过程从 SQL Server 中调用。下面是放置文件的方法。当我传递 SqlBoolean DeleteLocalFolder=
我是一名优秀的程序员,十分优秀!