C# 如何将数据保存到.NET上的网络路径?

C# 如何将数据保存到.NET上的网络路径?,c#,.net,C#,.net,我真的很难将数据保存到本地网络NAS(如果需要的话,可以使用Synology DS214) 在程序的另一部分中创建了一些文件后,我需要将它们存储在网络文件夹中,但我无法正确处理身份验证/权限 我的代码是: 我在这里找到的用于WrapperImpersonationContext的代码: 正如在我的代码中所写,当我尝试移动文件时,我得到了一个UnauthorizedAccessException:对路径的访问被拒绝。我还尝试在网络文件夹中创建一个新文件,结果相同 查看上面链接的Michiel

我真的很难将数据保存到本地网络NAS(如果需要的话,可以使用Synology DS214)

在程序的另一部分中创建了一些文件后,我需要将它们存储在网络文件夹中,但我无法正确处理身份验证/权限

我的代码是:

我在这里找到的用于
WrapperImpersonationContext
的代码:

正如在我的代码中所写,当我尝试移动文件时,我得到了一个
UnauthorizedAccessException:对路径的访问被拒绝。
我还尝试在网络文件夹中创建一个新文件,结果相同

查看上面链接的Michiel Vanotegem代码时,我发现调用
LogonUser
函数时出现身份验证错误(错误代码1326,导致
Win32Exception(0x80004005):用户名或密码不正确

我尝试使用
WNetUseConnection
函数查看和查看页面,但当我尝试移动文件时(在将其替换为Michiel代码后),该函数没有出现错误,我得到了相同的
UnauthorizedAccessException:拒绝访问路径。

我还试图摆弄传递给模拟包装器的域,但似乎无法使其工作。我觉得我错过了什么。。。有人能帮我指出正确的方向或帮助我解决这个问题吗

所有提前捐款的人


编辑2017年12月15日11:52:我发现,如果在第一个错误后立即尝试重新运行
LogonUser
函数,我会得到一个不同的异常(错误87
Win32Exception(0x80004005):参数不正确

我遵循@LennartStoop建议,因此,我将代码放在
using
块中,而不是
try finally
使用我从答案中借用的代码:


使用此功能,我可以与网络文件夹建立连接,并执行提示Lennart:)所需的所有IO操作。

回到基础。你能在程序外保存一个文件吗。您使用的是Active Directory吗?密码为admin的admin是否有效?是的,我可以通过编程在电脑中创建并移动文件,我认为我们的本地网络中没有任何Active Directory,NAS不属于任何域,用户/密码是我使用windows文件资源管理器连接到远程文件夹时使用的密码,它们可以工作(我还可以创建、读取、更新和删除我试图从代码中修改的相同文件夹中的文件)嗯,你可以创建一个目录,但不能将文件移动到其中,这很奇怪。这听起来不像是登录问题。考虑不直观的原因,您使用的帐户没有访问源文件的权限。为什么会这样呢。特别棘手,因为File.Move()还需要删除权限。是的,这很棘手,我忘了提到我移动的文件是由同一个程序生成的,这只是我想用来将它们移动到正确位置的代码。你使用的包装器很旧。。您是否尝试过不同的方法,例如使用?
WrapperImpersonationContext WIContext = 
    new WrapperImpersonationContext("\\\\DiskStation", "admin", "admin");

try
{
    WIContext.Enter();

    // code to select the final path simplified.
    string fileName = "file.txt"; 
    string originalPath = Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments);
    originalPath= Path.Combine(new string[] {originalPath, fileName});
    string finalPath = "\\\\DiskStation\\Virtual\\DestFolder";

    if (!Directory.Exists(finalPath))
    {
        // This goes well for whatever reason
        Directory.CreateDirectory(finalPath);
    }
    finalPath = Path.Combine(new string[] {finalPath, fileName});

    // This fails for wrong username/password
    File.Move(originalPath, finalPath);

} catch (Exception ex)
{
    // Exception showing simplified here
    MessageBox.Show(ex.ToString());
    throw;
} finally
{
    WIContext.Leave();
}
using (NetworkConnection netConn = 
    new NetworkConnection("\\\\DiskStation", new NetworkCredential("admin", "admin")))
{
    // My code here
}