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

当dns或netbios不可用时,如何通过网络模拟用户的文件副本分享

时间:2023-04-10 22:38:12 C#

C#学习教程:如何模拟用户在dns或netbios不可用时通过网络复制文件我在DomainA上运行ComputerA,因为userA需要将一个非常大的文件复制到WorkgroupB上的ComputerB,IP为192.168.10.2到只有userB具有写入权限的Windows共享。没有netbios或dns解析,因此必须通过IP引用计算机我首先尝试AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);WindowsIdentityUserB=newWindowsIdentity("192.168.10.2\UserB","PasswordB");//ExecptionWindowsImpersonationContextcontext=UserB.Impersonate()File.Copy(@"d:bigfile",@"\192.168.10.2bifgile");contex.Undo();但是我得到一个System.Security.SecurityException“提供的不是正确格式的帐户名。”所以我尝试了AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);WindowsIdentitywebinfinty=newWindowsIdentity("ComputerB\UserB","PasswordB");//Execption但我得到“登录失败:未知的用户名或错误的密码。”而是错误。所以我尝试了IntPtr令牌;boolsucceeded=LogonUser("UserB","192.168.10.2","PasswordB",LogonTypes.Network,LogonProviders.Default,outtoken);if(!succeded){thrownewWin32Exception(Marshal.GetLastWin32Error());}WindowsImpersonationContextcontext=WindowsIdentity.Impersonate(token);(...)[DllImport("advapi32.dll",SetLastError=true)]staticexternboolLogonUser(stringprincipal,stringauthority,stringpassword,LogonTypeslogonType,LogonProviderslogonProvider,outIntPtrtoken);但LogonUser返回false并显示win32错误“登录失败:未知用户名或密码错误”我知道我的用户名和密码没有问题,我已经以该用户身份登录到计算机B。我的回答可能适用于您正在尝试的任何推荐吗?(链接答案的重复)这个问题让我处于同样的境地,需要快速到达那里。以下是我调整代码的方法:usingSystem;使用System.Runtime.InteropServices;//////实现对操作系统的P/InvokeInterop调用。///internalstaticclassNativeMethods{//////要执行的登录操作的类型。///internalenumLogonType:int{//////此登录类型适用于将以交互方式///使用计算机的用户,例如通过///终端服务器、远程shell登录的用户,或类似的过程。///这种登录类型有额外的缓存登录信息的开销///用于断开连接的操作;因此,它///不适用于某些客户端/服务器应用程序,例如///邮件服务器。///Interactive=2,//////此登录类型用于高性能服务器///验证明文密码。///LogonUser函数不缓存此///登录类型的凭据。///Network=3,//////此登录类型适用于批处理服务器,其中进程///可能代表用户执行而无需他们的直接///干预。这种类型也适用于更高性能的服务器///一次处理许多明文身份验证尝试,///例如邮件或Web服务器。///LogonUser函数不缓存此///登录类型的凭据。///Batch=4,//////表示服务类型登录。提供的帐户必须启用///服务权限。///Service=5,//////此登录类型适用于登录用户的GINADLL,这些用户///将以交互方式使用计算机。///此登录类型可以生成一个唯一的审核记录,显示///工作站何时解锁。///Unlock=7,//////此登录类型在///身份验证包中保留名称和密码,这允许服务器在模拟///客户端时与其他网络服务器建立///连接.服务器可以接受来自///客户端的明文凭据,调用LogonUser,ve确保用户可以通过网络访问///系统,并且仍然可以与其他///服务器通信。///注意:WindowsNT:不支持该值。///NetworkCleartext=8,//////此登录类型允许调用者克隆其当前令牌///并为出站连接指定新凭据。新的///登录会话具有相同的本地标识符,但对其他网络连接使用不同的///凭据。///注意:此登录类型仅受///LOGON32_PROVIDER_WINNT50登录提供程序支持。///注意:WindowsNT:不支持该值。///NewCredentials=9}//////指定登录提供程序。///internalenumLogonProvider:int{//////使用系统的标准登录提供程序。///默认的安全提供者是negotiate,除非你为域名传递///NULL并且用户名不是UPN格式。///在这种情况下,默认提供程序是NTLM。///注意:Windows2000/NT:默认安全提供程序是NTLM。///Default=0,//////如果您要针对Windows///NT3.51域控制器进行身份验证(使用NT3.51登录提供程序),请使用此提供程序。///WinNT35=1,//////使用NTLM登录提供程序。///WinNT40=2,//////使用协商登录提供程序。///WinNT50=3}//////要执行的登录操作类型。///internalenumSecurityImpersonationLevel:int{//////服务器进程无法获取有关客户端的身份信息///,也无法模拟客户端。///定义时没有给定值,因此,根据ANSIC规则,///默认值为零。///Anonymous=0,//////服务器进程可以获得有关客户端的信息,///例如安全标识符和权限,但它不能///模拟客户端。这对于导出///它们自己的对象的服务器很有用,例如,导出///表和v的数据库产品意见。使用检索到的客户端安全///信息,服务器可以做出访问验证决策///而无法使用其他正在使用///客户端安全上下文的服务。///Identification=1,//////服务器进程可以在其本地系统上模拟客户端的安全///上下文。服务器无法模拟远程系统上的///客户端。///Impersonation=2,//////服务器进程可以在远程系统上模拟客户端的安全///上下文。///注意:WindowsNT:不支持此模拟级别。///Delegation=3}//////登录用户。//////用户名。///域。///密码。///登录类型。///登录提供者。///令牌。///如果函数成功则为真,如果函数失败则为假。///要获取扩展错误信息,请调用GetLastError。[DllImport("advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)][返回:MarshalAs(UnmanagedType.Bool)]internalstaticexternboolLogonUser(stringuserName,stringdomain,stringpassword,LogonTypelogonType,LogonProviderlogonProvider,outIntPtrtoken);//////复制令牌。//////现有令牌///句柄。///安全模拟///级别。///重复的令牌///句柄。///如果函数成功则为真,如果函数失败则为假。///要获取扩展错误信息,请调用GetLastError。[DllImport("advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)][返回:MarshalAs(UnmanagedType.Bool)]internalstaticexternboolDuplicateToken(IntPtrexistingTokenHandle,SecurityImpersonationLevelsecurityImpersonationLevel,outIntPtrduplicateTokenHandle);//////关闭句柄。//////手柄。///如果函数成功则为真,如果函数失败则为假。///要获取扩展错误信息,请调用GetLastError。[DllImport("kernel32.dll",CharSet=CharSet.Unicode,SetLastError=true)][返回:MarshalAs(UnmanagedType.Bool)]internalstaticexternboolCloseHandle(IntPtrhandle);}其次是IntPtrtoken;if(!NativeMethods.LogonUser(this.userName,this.domain,this.password,NativeMethods.LogonType.NewCredentials,NativeMethods.LogonProvider.Default,outtoken)){thrownewWin32Exception();}尝试{IntPtrtokenDuplicate;如果(!NativeMethods.DuplicateToken(token,NativeMethods.SecurityImpersonationLevel.Impersonation,outtokenDuplicate)){thrownewWin32Exception();}try{using(WindowsImpersonationContextimpersonationContext=newWindowsIdentity(tokenDuplicate).Impersonate()){//在这里用你的共享做一些事情。impersonationContext.Undo();返回;}}finally{if(tokenDuplicate!=IntPtr.Zero){if(!NativeMethods.CloseHandle(tokenDuplicate)){//如果您需要了解这种情况,请取消注释。////抛出新的Win32Exception();}}}}finally{if(token!=IntPtr.Zero){if(!NativeMethods.CloseHandle(token)){//如果您需要了解这种情况,请取消注释。////抛出新的Win32Exception();}}}私人常量intLOGON32_LOGON_TYPE=9;私有constintLOGON32_PROVIDER_DEFAULT=3;如果(LogonUser(userName,domain,password,**LOGON32_LOGON_TYPE,LOGON32_PROVIDER_DEFAULT,**reftoken)!=0){我的意思是,你试过了吗?user@computer而不是computeruser?以上就是C#学习教程:dns或netbios不可用时,如何模拟用户通过网络进行文件拷贝共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: