当前位置: 首页 > 编程语言 > C#

打开其他用户和域下的共享文件?分享

时间:2023-04-11 10:28:14 C#

打开其他用户和域下的共享文件?我有一个C#控制台应用程序需要读取另一个域中计算机上的共享文件。当应用程序尝试访问该文件时,由于本地用户没有访问共享资源的权限而发生异常。目前,我通过从运行中打开共享文件夹,将用户名和密码放入Windows身份验证对话框,然后运行应用程序来手动解决这个问题。我如何以编程方式执行此操作?a)使用LOGON32_LOGON_NEW_CREDENTIALS调用LogonUser并使用新令牌创建新的WindowsIdentity,然后使用正常的文件访问。b)p/调用WNetAddConnection3。请注意,这会使您计算机上的所有其他进程都可以访问您的远程共享。c)通过System.Management和CIM_DataFileWMI;你甚至不需要p/invoke。System.Management允许您指定远程计算机的凭据。我按照“Anton”的建议使用点“a”,我为一个类开发了两个版本,第一个使用Win32API,第二个使用WindowsIdentity类版本1:classUserImpersonation:IDisposable{[DllImport("advapi32.dll")]publicstaticexternintLogonUser(StringlpszUserName,StringlpszDomain,StringlpszPassword,intdwLogonType,intdwLogonProvider,refIntPtrphToken);[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]publicstaticexternintDuplicateToken(IntPtrhToken,intimpersonationLevel,refIntPtrhNewToken);[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]publicstaticexternboolRevertToSelf();[DllImport("kernel32.dll",CharSet=CharSet.Auto)]publicstaticexternboolCloseHandle(IntPtrhandle);constintLOGON32_PROVIDER_DEFAULT=0;constintLOGON32_LOGON_INTERACTIVE=2;WindowsImpersonationContextwic;字符串_用户名;字符串域,字符串密码){_userName=userName;_域=域;_passWord=密码;}publicboolImpersonateValidUser(){WindowsIdentitywi;IntPtrtoken=IntPtr.Zero;IntPtrtokenDuplicate=IntPtr.Zero;if(RevertToSelf()){if(LogonUser(_userName,_domain,_passWord,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,reftoken)!=0){if(DuplicateToken(token,2,reftokenDuplicate)!=0){wi=newWindowsIdentity(令牌重复);wic=wi.Impersonate();如果(wic!=null){CloseHandle(令牌);CloseHandle(tokenDuplicate);返回真;}}}}如果(令牌!=IntPtr.Zero)CloseHandle(令牌);如果(tokenDuplicate!=IntPtr.Zero)CloseHandle(tokenDuplicate);返回假;}#regionIDisposableMemberspublicvoidDispose(){if(wic!=null)wic.Dispose();RevertToSelf();}#endregion}版本2(来自MSDN,只有很小的变化)dwLogonProvider,refIntPtrphToken);[DllImport("kernel32.dll",CharSet=CharSet.Auto)]publicstaticexternboolCloseHandle(IntPtrhandle);WindowsImpersonationContextwic;IntPtrtokenHandle;字符串_用户名;字符串_域;字符串_密码;publicUserImpersonation2(stringuserName,stringdomain,stringpassWord){_userName=userName;_domain=域;_passWord=密码;}constintLOGON32_PROVIDER_DEFAULT=0;constintLOGON32_LOGON_INTERACTIVE=2;publicboolImpersonateValidUser(){boolreturnValue=LogonUser(_userName,_domain,_passWord,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,reftokenHandle);Console.WriteLine("调用了LogonUser。");if(false==returnValue){intret=Marshal.GetLastWin32Error();Console.WriteLine("LogonUser失败,错误代码:{0}",ret);返回假;}Console.WriteLine("登录用户成功了吗?"+(returnValue?"Yes":"No"));Console.WriteLine("WindowsNT令牌的值:"+token句柄);//检查身份。Console.WriteLine("模拟前:"+WindowsIdentity.GetCurrent().Name);//使用LogonUser返回的令牌句柄。WindowsIdentitynewId=newWindowsIdentity(tokenHandle);wic=newId.Impersonate();//检查身份。Console.WriteLine("模拟后:"+WindowsIdentity.GetCurrent().Name);返回真;}#regionIDisposableMemberspublicvoidDispose(){if(wic!=null)wic.Undo();如果(tokenHandle!=IntPtr.Zero)CloseHandle(tokenHandle);}#endregion}如何使用(两者相同)conststringfile=@"\machinetestfile.txt";使用(UserImpersonationuser=newUserImpersonation("user","domain","password")){if(user.ImpersonateValidUser()){StreamReaderreader=newStreamReader(file);Console.WriteLine(reader.ReadToEnd());读者。关闭();根据记忆,您需要使用WindowsAPI调用并以不同域上的用户身份登录请参见此链接以获取示例。另一个想法可能是使用RunAs命令行参数来读取文件并将其保存到本地域/服务器上的文件中。以上就是C#学习教程:打开其他用户和域下的共享文件?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: