Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 12:17   #1
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
Вопрос Авторизация на удалённом компьютере

Мне необходимо копировать файлы по сети, но для доступа к удалённому компьютеру требуется пройти авторизацию (если заходить через проводник, то появляется специальное окно).

Как сделать так, чтобы перед копированием файла программа отправляла логин и пароль на удалённый компьютер?

Аутентификация пользователей обычная Windows.
Никки вне форума Ответить с цитированием
Старый 15.11.2010, 13:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насчет дотНета я не знаю, но попробуй поищи в ней аналог функции WNetAddConnection2.
В делфи это выглядит так:
Код:
//**************************************************************************
{Подключение сет диска ConnectNetDrive('Y:','\\xp\c$','Vi','');}
 function ConnectNetDrive(DriveName,Machine,User,Pass:string):variant;
  var

NRW: TNetResource;v:variant;
begin

with NRW do
begin
dwType := RESOURCETYPE_ANY;
lpLocalName := pchar(DriveName); // подключаемся к диску с этой буквой
lpRemoteName := pchar(machine);
// Необходимо заполнить. В случае пустой строки
// используется значение lpRemoteName.
lpProvider := '';
end;
v:=WNetAddConnection2(NRW, pchar(pass), pchar(user),CONNECT_UPDATE_PROFILE);
//****** CASE ******
case v of
  ERROR_ACCESS_DENIED	:result:='ERROR_ACCESS_DENIED';
  ERROR_ALREADY_ASSIGNED:result:='ERROR_ALREADY_ASSIGNED';
  ERROR_BAD_DEV_TYPE	:result:='ERROR_BAD_DEV_TYPE';
  ERROR_BAD_DEVICE      :result:='ERROR_BAD_DEVICE';
  ERROR_BAD_NET_NAME	:result:='ERROR_BAD_NET_NAME';
  ERROR_BAD_PROFILE	:result:='ERROR_BAD_PROFILE';
  ERROR_BUSY            :result:='ERROR_BUSY';
  ERROR_CANCELLED       :result:='ERROR_CANCELLED';
  ERROR_CANNOT_OPEN_PROFILE:result:='ERROR_CANNOT_OPEN_PROFILE';
  ERROR_DEVICE_ALREADY_REMEMBERED:result:='ERROR_DEVICE_ALREADY_REMEMBERED';
  ERROR_EXTENDED_ERROR		:result:='ERROR_EXTENDED_ERROR';
  ERROR_INVALID_PASSWORD	:result:='ERROR_INVALID_PASSWORD';

  ERROR_NO_NET_OR_BAD_PATH	:result:='ERROR_NO_NET_OR_BAD_PATH';
  ERROR_NO_NETWORK	:result:='ERROR_NO_NETWORK';
else result:='';//machine+' ('+DriveName+')' ;
end;
//****** END CASE ******
end;
Это подключение сетевого диска (можно без буквы).
Поищи аналоги а сборках.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2010, 13:54   #3
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

Тут у Вас используется специальная функция для подключения сетевого диска, а мне нужно просто авторизоваться, чтобы потом при доступе к C$ и D$ не возникло вопросов.
Никки вне форума Ответить с цитированием
Старый 17.11.2010, 13:56   #4
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

Stilet, Да. то что Вы написали оказывается подходит и мне... Просто нужно передать этой функции другие данные.

Код:
[StructLayout(LayoutKind.Sequential)]
  public struct NETRESOURCE
  {
    public int dwScope;
    public int dwType;
    public int dwDisplayType;
    public int dwUsage;
    public string LocalName;
    public string RemoteName;
    public string Comment;
    public string Provider;
  }

  class WinNet
  {
    [DllImport("mpr.dll", SetLastError = true)]
    static extern int WNetAddConnection2(ref NETRESOURCE netResource, string password, string username, int flags);
    static public void Connect(string server, string user, string password)
    {
      NETRESOURCE rc = new NETRESOURCE();
      rc.dwType = 0x00000000;
      rc.RemoteName = server;
      rc.LocalName = null;
      rc.Provider = null;
      int ret = WNetAddConnection2(ref rc, password, user, 0);
    }

    [DllImport("mpr.dll", SetLastError = true)]
    static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce);

    static public void Disconnect(string server)
    {
      int ret = WNetCancelConnection2(server, 0, true); 
    }

  }
Никки вне форума Ответить с цитированием
Старый 17.11.2010, 17:39   #5
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

Код:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace ImpersonateTest
{
    public enum LogonType
    {
        LOGON32_LOGON_INTERACTIVE = 2,
        LOGON32_LOGON_NETWORK = 3,
        LOGON32_LOGON_BATCH = 4,
        LOGON32_LOGON_SERVICE = 5,
        LOGON32_LOGON_UNLOCK = 7,
        LOGON32_LOGON_NETWORK_CLEARTEXT = 8,// Win2K or higher
        LOGON32_LOGON_NEW_CREDENTIALS = 9// Win2K or higher
    };

    public enum LogonProvider
    {
        LOGON32_PROVIDER_DEFAULT = 0,
        LOGON32_PROVIDER_WINNT35 = 1,
        LOGON32_PROVIDER_WINNT40 = 2,
        LOGON32_PROVIDER_WINNT50 = 3
    };

    public enum ImpersonationLevel
    {
        SecurityAnonymous = 0,
        SecurityIdentification = 1,
        SecurityImpersonation = 2,
        SecurityDelegation = 3
    }

    class Win32NativeMethods
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern int LogonUser(string lpszUserName,
        string lpszDomain,
        string lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool CloseHandle(IntPtr handle);
    }

    public class SecurityHelper : IDisposable
    {
        private WindowsImpersonationContext _wic;

        public SecurityHelper(string userName, string domainName, string password, 
            LogonType logonType, LogonProvider logonProvider)
        {
            Impersonate(userName, domainName, password, logonType, logonProvider);
        }

        public SecurityHelper(string userName, string domainName, string password)
        {
            Impersonate(userName, domainName, password, LogonType.LOGON32_LOGON_INTERACTIVE,
                LogonProvider.LOGON32_PROVIDER_DEFAULT);
        }

        public void Dispose()
        {
            UndoImpersonation();
        }

        public void Impersonate(string userName, string domainName, string password)
        {
            Impersonate(userName, domainName, password, LogonType.LOGON32_LOGON_INTERACTIVE,
                LogonProvider.LOGON32_PROVIDER_DEFAULT);
        }

        public void Impersonate(string userName, string domainName, string password,
            LogonType logonType, LogonProvider logonProvider)
        {
            UndoImpersonation();
            IntPtr logonToken = IntPtr.Zero;
            IntPtr logonTokenDuplicate = IntPtr.Zero;
            try
            {
                _wic = WindowsIdentity.Impersonate(IntPtr.Zero);
                if (Win32NativeMethods.LogonUser(userName, domainName, password, (int)logonType,
                    (int)logonProvider, ref logonToken) != 0)
                {
                    if (Win32NativeMethods.DuplicateToken(logonToken, (int)ImpersonationLevel.SecurityImpersonation, ref logonTokenDuplicate) != 0)
                    {
                        WindowsIdentity wi = new WindowsIdentity(logonTokenDuplicate);
                        wi.Impersonate();
                    }
                    else
                    {
                        throw new Win32Exception(Marshal.GetLastWin32Error());
                    }
                }
            }
            finally
            {
                if (logonToken != IntPtr.Zero)
                    Win32NativeMethods.CloseHandle(logonToken);
                if (logonTokenDuplicate != IntPtr.Zero)
                    Win32NativeMethods.CloseHandle(logonTokenDuplicate);
            }
        }

        private void UndoImpersonation()
        {
            if (_wic != null)
            _wic.Undo();
            _wic = null;
        }
    }
}
akasex вне форума Ответить с цитированием
Старый 17.11.2010, 20:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
у Вас используется специальная функция для подключения сетевого диска
Уточню немного:Эта функа создает коннект с ресурсом в сети, естесственно подразумевается авторизация, учитывая что c$,d$ и прочие шары-невидимки тоже есть ресурс сети, Даже просто для авторизации нужно открыть одну из этих шар, даже говорят что можно просто открыть шару на принтер, и ты считай авторизировался на удаленной машине
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка ЦП на удалённом ПК? frox Общие вопросы Delphi 5 20.11.2009 09:01
Работа с файлами на удалённом сервере DenisVoronov Помощь студентам 25 04.05.2009 19:43
Работа с файлами на удалённом сервере DenisVoronov Общие вопросы Delphi 2 02.05.2009 17:13
chgrp на удалённом сервере goblinyara Операционные системы общие вопросы 3 15.03.2009 18:19
запуск программы на удалённом компе SERG1980 Работа с сетью в Delphi 3 30.07.2008 13:50