Запрос логина при доступе к удаленной папке
От: 7C  
Дата: 31.03.09 05:12
Оценка:
Копирую файл в удаленную папку (сейчас функцией CopyFile, но не суть).
Возникла необходимость запускать эту программу под пользователем, который не имеет права писать в данную удаленную папку.
Как бы мне указать перед (или при) копированием имя и пароль?

P.S. Не хотелось бы делать через ftp и т.п., а именно чисто виндовыми правами ограничиться.
Re: Запрос логина при доступе к удаленной папке
От: Аноним  
Дата: 31.03.09 05:25
Оценка:
Здравствуйте, 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 );
        }
Re: Запрос логина при доступе к удаленной папке
От: Pavel Dvorkin Россия  
Дата: 31.03.09 05:27
Оценка:
Здравствуйте, 7C, Вы писали:

7C>Копирую файл в удаленную папку (сейчас функцией CopyFile, но не суть).

7C>Возникла необходимость запускать эту программу под пользователем, который не имеет права писать в данную удаленную папку.
7C>Как бы мне указать перед (или при) копированием имя и пароль?

Надо создать процесс от имени пользователя , который на это имеет право (CreateProcessAsUser). Потом можно у него взять токен (OpenProcessToken) и имперсонализировать копирующий поток (ImpersonateLoggedOnUser)
With best regards
Pavel Dvorkin
Re[2]: Запрос логина при доступе к удаленной папке
От: 7C  
Дата: 31.03.09 05:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, 7C, Вы писали:


7C>>Копирую файл в удаленную папку (сейчас функцией CopyFile, но не суть).

7C>>Возникла необходимость запускать эту программу под пользователем, который не имеет права писать в данную удаленную папку.
7C>>Как бы мне указать перед (или при) копированием имя и пароль?

PD>Надо создать процесс от имени пользователя , который на это имеет право (CreateProcessAsUser). Потом можно у него взять токен (OpenProcessToken) и имперсонализировать копирующий поток (ImpersonateLoggedOnUser)


Это не годится, т.к. данный комп не знает этого пользователя (и хорошо).
Re[2]: Запрос логина при доступе к удаленной папке
От: 7C  
Дата: 31.03.09 05:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот, попробуй через WNetAddConnection3


Спасибо, вроде годится.
Щас попробую...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.