Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过读/写检查连接到NAS服务器。模拟失败_C#_Nas - Fatal编程技术网

C# 通过读/写检查连接到NAS服务器。模拟失败

C# 通过读/写检查连接到NAS服务器。模拟失败,c#,nas,C#,Nas,我正在开发一个程序,该程序必须检查是否有与NAS的连接,以及是否可以从中写入和读取数据。检查连接不是问题 我在Windows Server 2012上运行,知道NAS的凭据。 我试着用这些凭证来模拟,但这不起作用。我总是犯同样的错误。用户名或密码不正确。但是,当我使用相同的凭据连接windows资源管理器时,它会工作 这是我的DLL导入和必要的变量 [DllImport("advapi32.dll", SetLastError = true)] public static extern

我正在开发一个程序,该程序必须检查是否有与NAS的连接,以及是否可以从中写入和读取数据。检查连接不是问题

我在Windows Server 2012上运行,知道NAS的凭据。 我试着用这些凭证来模拟,但这不起作用。我总是犯同样的错误。用户名或密码不正确。但是,当我使用相同的凭据连接windows资源管理器时,它会工作

这是我的DLL导入和必要的变量

[DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain,
    String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

// Variables
private IntPtr m_Token;
private WindowsImpersonationContext m_Context = null;
private string m_Domain;
private string m_Password;
private string m_Username;
m_域与本地域不同

这是真实的模仿

            m_Token = IntPtr.Zero;
            bool logonSuccessfull = LogonUser(
               m_Username,
               m_Domain,
               m_Password,
               (int)LOGON32_TYPE_NETWORK,
               (int)LOGON32_PROVIDER_WINNT50,
               ref m_Token);
            if (logonSuccessfull == false)
            {
                int error = Marshal.GetLastWin32Error();
                throw new Win32Exception(error);
            }
            WindowsIdentity identity = new WindowsIdentity(m_Token);
            m_Context = identity.Impersonate();
LOGON32_类型_网络等于3, LOGON32\u PROVIDER\u WINNT50等于3

此代码以管理员权限执行

这是引发的错误:

System.ComponentModel.Win32Exception (0x80004005): The user name or password is incorrect
此错误被抛出

if (logonSuccessfull == false)
{
     int error = Marshal.GetLastWin32Error();
     throw new Win32Exception(error);
}
还有别的办法吗? 或者必须使用其他LogonType或LogonProvider

这些我也尝试过,但对我来说也不起作用

private const int LOGON32_PROVIDER_DEFAULT = 0;
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_TYPE_NEW_CREDENTIALS = 9;
当使用LOGON32\u TYPE\u NEW\u凭据时,不会抛出错误,但
模拟用户根本不会改变。

我可以通过使用网络凭据和mpr.dll来解决isse问题

[DllImport(“mpr.dll”)]
专用静态外部int WNetAddConnection2(NetResource NetResource,
字符串密码、字符串用户名、int标志);
[DllImport(“mpr.dll”)]
私有静态外部int OwntcancelConnection2(字符串名称、int标志、bool force);
[StructLayout(LayoutKind.Sequential)]
公共类网络资源
{
公共资源范围;
公共资源型资源型;
公共资源显示类型显示类型;
公共用途;
公共字符串LocalName;
公共字符串名称;
公共字符串评论;
公共字符串提供者;
}
公共枚举资源范围:int
{
已连接=1,
全球网络,
记得,,
最近的
上下文
};
公共枚举资源类型:int
{
任意=0,
磁盘=1,
打印=2,
保留=8,
}
公共枚举资源显示类型:int
{
通用=0x0,
域=0x01,
服务器=0x02,
共享=0x03,
文件=0x04,
组=0x05,
网络=0x06,
Root=0x07,
Shareadmin=0x08,
目录=0x09,
树=0x0a,
Ndscontainer=0x0b
}
void ConnectToNas(字符串用户名、字符串密码、字符串网络名){
NetworkCredential cred=新的NetworkCredential(用户名、密码);
var netResource=新的netResource
{
Scope=ResourceScope.GlobalNetwork,
ResourceType=ResourceType.Disk,
DisplayType=ResourceDisplaytype.Share,
RemoteName=网络名称
};
var result=wneTadConnection2(网络资源、凭据、密码、用户名,0);
如果(结果!=0)
{
抛出新的Win32Exception(结果,“连接到NAS时出错”);
}
}
要关闭连接,请执行以下操作:

void CloseConnection(字符串networkName){
WNetCancelConnection2(网络名称,0,true);
}
通过这种方式,我可以连接到NAS,并通过向其写入文件、读取文件然后删除文件来检查它是否可读写