Запуск проги под другой учёткой.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Запуск проги под другой учёткой.

Сообщение Nord777 » 27.04.2008 (Вс) 13:53

Созрела необходимость запустить прогу под другой учеткой.
Сделал, но не покидает чувство, что кривовато.
У кого-нибудь есть другие идеи?
Можно ли это сделать без перезапуска приложения?

вот код:
Код: Выделить всё
    Private Sub MyApplication_Startup(ByVal sender As Object, _
     ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _
     Handles Me.Startup

      Dim SS As SecureString
      Dim PSI As New ProcessStartInfo
      Dim User As String = Threading.Thread.CurrentPrincipal.Identity.Name

      If String.Compare("CompName\test", User, True) <> 0 Then
        e.Cancel = True
        SS = New SecureString
        SS.AppendChar("t"c)
        SS.AppendChar("e"c)
        SS.AppendChar("s"c)
        SS.AppendChar("t"c)

        PSI.Password = SS
        PSI.UserName = "test"
        PSI.UseShellExecute = False
        PSI.FileName = System.Windows.Forms.Application.ExecutablePath

        Process.Start(PSI)
      End If

    End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 27.04.2008 (Вс) 15:58

Можно ли это сделать без перезапуска приложения?

LogonUser (advapi32)

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 27.04.2008 (Вс) 17:56

Gloom спасибо, это то что надо.
Вот только скорость идентификации какая то медленная (~3-5сек)
Это нормально?

Пробовал на своем компьютере(XP SP2).
В дальнейшем предполагается коннект к Win2003Server.


Добавлено позже:
Вопрос снят.
Причиной задержки был MsgBox, правда я впервые вижу, чтобы он давал такие тормоза...
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 28.04.2008 (Пн) 18:32

В дальнейшем предполагается коннект к Win2003Server

Здесь-то облом меня и настиг ))

MSDN писал(а):You cannot use LogonUser to log on to a remote computer
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 29.04.2008 (Вт) 1:20

Nord777 писал(а):Здесь-то облом меня и настиг ))
MSDN писал(а):You cannot use LogonUser to log on to a remote computer

Не понял, честно говоря, в чём проблема.
Если мы успешно аутентифицировались локально, то если наша учётка
- или принадлежит тому же домену, что и удалённый сервер;
- или принадлежит домену, связанному с доменом удалённого сервера доверительными отношенями;
- или её данные (имя и пароль) полностью совпадают с локальной учётной записью на удалённом сервере;

мы сможем аутентифицироваться и на удалённом сервере...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 29.04.2008 (Вт) 10:28

Nord777
А как ты себе это видиш? :D
Ты хочешь запустить на своем компьютере прогу от имени пользователя, который есть на другом компьютере(при условии что нету домена?)
Или ты думаешь что logonuser чудесным образом перенесет твою прогу на удаленный компьютер? Если да, то куда он должен ее перенести?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 29.04.2008 (Вт) 10:32

- или принадлежит тому же домену, что и удалённый сервер;
- или принадлежит домену, связанному с доменом удалённого сервера доверительными отношенями;
DNS/Active Directory отсутствуют.

- или её данные (имя и пароль) полностью совпадают с локальной учётной записью на удалённом сервере;
мы сможем аутентифицироваться и на удалённом сервере...
А вот этого не пробовал. Нужная учетка есть только на сервере (не хотелось бы создавать её на всех компах). Но тем не менее, этот вариант я сегодня обязательно попробую (по идее должно прокатить).

Нарыл ещё WNetAddConnection2. По моему это как раз то, что надо. Но на сервере тоже пока не проверял.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 29.04.2008 (Вт) 10:47

ANDLL
А как ты себе это видиш?

Честно говоря пока ни как не вижу :D
Я в процессе поиска решений, раньше как то не приходилось этим заниматься.

А стремлюсь я к этому:
На сервере есть папка, на которую даны права:
Чтение - для всех
Запись/изменение - только для одной учетки.

Есть прога, которая будет запускаться на всех остальных компах.
И именно этой(и только этой) программе должно быть разрешено создание и изменение файлов в оговоренной выше папке на сервере.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 29.04.2008 (Вт) 14:51

Ну тогда либо учетка с одинаковыми логинами\паролями, либо домен, либо WNetAddConnection2, либо net use\сетевые диски
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.05.2008 (Чт) 12:44

Ну тогда либо учетка с одинаковыми логинами\паролями, либо домен, либо WNetAddConnection2, либо net use\сетевые диски

WNetAddConnection2 работает, но имеет одну нехорошую особенность:
При попытке подключении к серверу вываливается исключение "Множественное подключение к серверу или разделяемым ресурсам одним пользователем с использованием более одного имени пользователя неразрешено, отключите все предыдущие подключения к серверу или разделяемым ресурсам и повторите."
Для обхода этого исключения, перед коннектом, надо вызывать WNetCancelConnection2, которая закрывает все соединения к нужному ресурсу. При этом другие программы, висящие на заднем плане и имеющии открытые файлы из этого ресурса, ничего не знают о закрытии этого соединения. В итоге их поведение становится весьма неадекватным (как у собаки, из пасти которой вырвали сахарную косточку :) )

Решение нашлось, причем для этого совсем не нужно создавать ни одинаковые учетки ни домен. Достаточно одной учетки на сервере.
Как ни странно, решение - LogonUser, которая несмотря на заявление о невозможности залогинится на удаленном компе, все же позволяет это сделать. Косвенно об этом говорится в описании константы LOGON32_LOGON_NEW_CREDENTIALS параметра dwLogonType. Описание звучит примерно так:
Код: Выделить всё
Этот тип входа позволяет вызывающему клонировать его текущий токен и определить
новый мандат(credentials) для исходящих подключений. Новый сеанс входа в систему
имеет тот же самый локальный идентификатор, но использует отличный мандат для других
сетевых подключений.
NOTE: This logon type is supported only by the LOGON32_PROVIDER_WINNT50 logon provider.
NOTE: Windows NT:  This value is not supported.


Найденоое решение проверил, оно прекрасно работает и полностью удовлетворяет поставленной задаче. Спасибо всем за участие.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 91

    TopList  
cron