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