当dns或netbios不可用时,如何通过网络模拟用户的文件副本
可能重复:
在C#中访问Windows中受密码保护的网络驱动器?
我在DomainA上运行ComputerA作为userA需要将一个非常大的文件复制到WorkgroupB上的ComputerB,其中ip为192.168.10.2到只有userB具有写访问权限的Windows共享。
没有netbios或dns解析因此计算机必须由IP引用
我先试试
AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal); WindowsIdentity UserB = new WindowsIdentity("192.168.10.2\UserB", "PasswordB"); //Execption WindowsImpersonationContext contex = UserB.Impersonate() File.Copy(@"d:bigfile", @"\192.168.10.2bifgile"); contex.Undo();
但我得到一个System.Security.SecurityException
“提供的名称不是一个正确形成的帐户名称。”
所以我试过了
AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal); WindowsIdentity webinfinty = new WindowsIdentity("ComputerB\UserB", "PasswordB"); //Execption
但我得到“登录失败:未知的用户名或密码错误。” 而错误。
所以我试过
IntPtr token; bool succeded = LogonUser("UserB", "192.168.10.2", "PasswordB", LogonTypes.Network, LogonProviders.Default, out token); if (!succeded) { throw new Win32Exception(Marshal.GetLastWin32Error()); } WindowsImpersonationContext contex = WindowsIdentity.Impersonate(token); (...) [DllImport("advapi32.dll", SetLastError = true)] static extern bool LogonUser( string principal, string authority, string password, LogonTypes logonType, LogonProviders logonProvider, out IntPtr token);
但LogonUser
返回false,并显示win32错误“登录失败:未知用户名或密码错误”
我知道我的用户名和密码很好,我已经以该用户身份登录到computerB。
任何reccomandations
我的答案可能适用于您正在尝试的内容吗?
(链接答案的副本)
这个问题让我在相同的情况下需要快速到达。
以下是我调整代码的方法:
using System; using System.Runtime.InteropServices; ///
/// Implements P/Invoke Interop calls to the operating system. /// internal static class NativeMethods { ////// The type of logon operation to perform. /// internal enum LogonType : int { ////// This logon type is intended for users who will be interactively /// using the computer, such as a user being logged on by a /// terminal server, remote shell, or similar process. /// This logon type has the additional expense of caching logon /// information for disconnected operations; therefore, it is /// inappropriate for some client/server applications, such as a /// mail server. /// Interactive = 2, ////// This logon type is intended for high performance servers to /// authenticate plaintext passwords. /// The LogonUser function does not cache credentials for this /// logon type. /// Network = 3, ////// This logon type is intended for batch servers, where processes /// may be executing on behalf of a user without their direct /// intervention. This type is also for higher performance servers /// that process many plaintext authentication attempts at a time, /// such as mail or Web servers. /// The LogonUser function does not cache credentials for this /// logon type. /// Batch = 4, ////// Indicates a service-type logon. The account provided must have /// the service privilege enabled. /// Service = 5, ////// This logon type is for GINA DLLs that log on users who will be /// interactively using the computer. /// This logon type can generate a unique audit record that shows /// when the workstation was unlocked. /// Unlock = 7, ////// This logon type preserves the name and password in the /// authentication package, which allows the server to make /// connections to other network servers while impersonating the /// client. A server can accept plaintext credentials from a /// client, call LogonUser, verify that the user can access the /// system across the network, and still communicate with other /// servers. /// NOTE: Windows NT: This value is not supported. /// NetworkCleartext = 8, ////// This logon type allows the caller to clone its current token /// and specify new credentials for outbound connections. The new /// logon session has the same local identifier but uses different /// credentials for other network connections. /// NOTE: This logon type is supported only by the /// LOGON32_PROVIDER_WINNT50 logon provider. /// NOTE: Windows NT: This value is not supported. /// NewCredentials = 9 } ////// Specifies the logon provider. /// internal enum LogonProvider : int { ////// Use the standard logon provider for the system. /// The default security provider is negotiate, unless you pass /// NULL for the domain name and the user name is not in UPN format. /// In this case, the default provider is NTLM. /// NOTE: Windows 2000/NT: The default security provider is NTLM. /// Default = 0, ////// Use this provider if you'll be authenticating against a Windows /// NT 3.51 domain controller (uses the NT 3.51 logon provider). /// WinNT35 = 1, ////// Use the NTLM logon provider. /// WinNT40 = 2, ////// Use the negotiate logon provider. /// WinNT50 = 3 } ////// The type of logon operation to perform. /// internal enum SecurityImpersonationLevel : int { ////// The server process cannot obtain identification information /// about the client, and it cannot impersonate the client. It is /// defined with no value given, and thus, by ANSI C rules, /// defaults to a value of zero. /// Anonymous = 0, ////// The server process can obtain information about the client, /// such as security identifiers and privileges, but it cannot /// impersonate the client. This is useful for servers that export /// their own objects, for example, database products that export /// tables and views. Using the retrieved client-security /// information, the server can make access-validation decisions /// without being able to use other services that are using the /// client's security context. /// Identification = 1, ////// The server process can impersonate the client's security /// context on its local system. The server cannot impersonate the /// client on remote systems. /// Impersonation = 2, ////// The server process can impersonate the client's security /// context on remote systems. /// NOTE: Windows NT: This impersonation level is not supported. /// Delegation = 3 } ////// Logs on the user. /// /// Name of the user. /// The domain. /// The password. /// Type of the logon. /// The logon provider. /// The token. ///True if the function succeeds, false if the function fails. /// To get extended error information, call GetLastError. [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool LogonUser( string userName, string domain, string password, LogonType logonType, LogonProvider logonProvider, out IntPtr token); ////// Duplicates the token. /// /// The existing token /// handle. /// The security impersonation /// level. /// The duplicate token /// handle. ///True if the function succeeds, false if the function fails. /// To get extended error information, call GetLastError. [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool DuplicateToken( IntPtr existingTokenHandle, SecurityImpersonationLevel securityImpersonationLevel, out IntPtr duplicateTokenHandle); ////// Closes the handle. /// /// The handle. ///True if the function succeeds, false if the function fails. /// To get extended error information, call GetLastError. [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool CloseHandle(IntPtr handle); }其次是
IntPtr token; if (!NativeMethods.LogonUser( this.userName, this.domain, this.password, NativeMethods.LogonType.NewCredentials, NativeMethods.LogonProvider.Default, out token)) { throw new Win32Exception(); } try { IntPtr tokenDuplicate; if (!NativeMethods.DuplicateToken( token, NativeMethods.SecurityImpersonationLevel.Impersonation, out tokenDuplicate)) { throw new Win32Exception(); } try { using (WindowsImpersonationContext impersonationContext = new WindowsIdentity(tokenDuplicate).Impersonate()) { // Do stuff with your share here. impersonationContext.Undo(); return; } } finally { if (tokenDuplicate != IntPtr.Zero) { if (!NativeMethods.CloseHandle(tokenDuplicate)) { // Uncomment if you need to know this case. ////throw new Win32Exception(); } } } } finally { if (token != IntPtr.Zero) { if (!NativeMethods.CloseHandle(token)) { // Uncomment if you need to know this case. ////throw new Win32Exception(); } } }
private const int LOGON32_LOGON_TYPE = 9; private const int LOGON32_PROVIDER_DEFAULT = 3;
这个参数应该适用
if ( LogonUser(userName, domain, password, **LOGON32_LOGON_TYPE, LOGON32_PROVIDER_DEFAULT,** ref token ) != 0 ) {
出乎我的意思,你试过吗?
user@computer
代替
computeruser
?
上述就是C#学习教程:当dns或netbios不可用时,如何通过网络模拟用户的文件副本分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030534.html