Копирую файл в удаленную папку (сейчас функцией CopyFile, но не суть).
Возникла необходимость запускать эту программу под пользователем, который не имеет права писать в данную удаленную папку.
Как бы мне указать перед (или при) копированием имя и пароль?
P.S. Не хотелось бы делать через ftp и т.п., а именно чисто виндовыми правами ограничиться.
Здравствуйте, 7C, Вы писали:
7C>Копирую файл в удаленную папку (сейчас функцией CopyFile, но не суть).
7C>Возникла необходимость запускать эту программу под пользователем, который не имеет права писать в данную удаленную папку.
7C>Как бы мне указать перед (или при) копированием имя и пароль?
7C>P.S. Не хотелось бы делать через ftp и т.п., а именно чисто виндовыми правами ограничиться.
Вот, попробуй через WNetAddConnection3
#region WNet...()
[StructLayout(LayoutKind.Sequential)]
private struct NETRESOURCE
{
public UInt32 dwScope;
public UInt32 dwType;
public UInt32 dwDisplayType;
public UInt32 dwUsage;
public string lpLocalName;
public string lpRemoteName;
public string lpComment;
public string lpProvider;
}
private const UInt32 RESOURCE_GLOBALNET = 0x00000002;
private const UInt32 RESOURCETYPE_ANY = 0x00000000;
private const UInt32 RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
private const UInt32 RESOURCEUSAGE_CONNECTABLE = 0x00000001;
private const UInt32 CONNECT_UPDATE_PROFILE = 0x00000001;
[DllImport("mpr.dll")] private static extern UInt32 WNetAddConnection3( IntPtr hwndOwner, ref NETRESOURCE lpNetResource, string lpPassword, string lpUserName, UInt32 dwFlags );
[DllImport("mpr.dll")] private static extern UInt32 WNetCancelConnection2( string lpName, UInt32 dwFlags, UInt32 fForce );
public static UInt32 WNetAddConnection(IntPtr WindowHandle, string MachineName, string UserName, string Password)
{
NETRESOURCE __nr = new NETRESOURCE();
__nr.dwScope = RESOURCE_GLOBALNET;
__nr.dwType = RESOURCETYPE_ANY;
__nr.dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
__nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;
__nr.lpLocalName = null;
__nr.lpRemoteName = "\\\\" + MachineName;
__nr.lpComment = null;
__nr.lpProvider = null;
return (WNetAddConnection3(WindowHandle, ref __nr, Password, UserName, CONNECT_UPDATE_PROFILE));
}
public static UInt32 WNetCancelConnection(string MachineName)
{
return (WNetCancelConnection2( "\\\\" + MachineName, 0, 1 ));
}
#region LogonUser
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll")] public static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", SetLastError = true)] public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", SetLastError = true)] public static extern bool RevertToSelf();
[DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr handle);
#endregion
#endregion
Using:
private bool Connect2Machine(string MachineName, string UserName, string Password )
{
return ((UInt32)0 == API.WNetAddConnection( IntPtr.Zero, MachineName, UserName, Password ));
}
private void DisconnectFromMachine(string MachineName)
{
API.WNetCancelConnection( MachineName );
}