VB 6 Почему не работает простой код и как передать данные из переменной?

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Всем привет!
Код предельно прост, на одних компьютерах работает - на других выдает ошибку... может кто посмотрит свежим взглядом?
Код:
Private Sub Command1_Click()
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """tscon.exe""""""  /password:12345"
End Sub

1539914320753.png


В командной строке - без проблем.

И заодно вопрос - как лучше передать в значение password: то, что находится в переменной?
Пока на уме только прямое чтение предварительно сохраненного.
p.s. программа переключает машины между параллельными сессиями.
 
Кирилл, это случайно не та ошибка, которая у тебя была из-за кривой иконки в ресурсах?
Собери голый проект.

На какой строке ошибка?

И заодно вопрос - как лучше передать в значение password: то, что находится в переменной?
В какой переменной?
 
Кирилл, это случайно не та ошибка, которая у тебя была из-за кривой иконки в ресурсах?
Собери голый проект.
Проект и так голый...ошибка на строке:
WshShell.Run """tscon.exe"""""" /password:12345"

Я вот думаю, там у меня VB стоит другой, может из за кривой сборки такое быть?
Это единственная разница, попробую скомпиллировать программу на "родном" компе и запустить там.
Я из среды запускал, но с правами админитратора.
Причем повторюсь, со своего компа нормально все, на том - ошибка.
Разные дистрибутивы VB это единственная разница.

В какой переменной?
Смотри, данная программа будет экстренно переходить из одной учетной записи в другую, причем в определенных ситуациях предыдущая сессия будет завершаться полностью, а в особо отдельных случаях экстренно покинутая учетка будет удалена вместе с файлами и на несколько раз "перезатерта"
Так как компов много, у каждого свои логин - пароль, то хочется, что бы программа могла бы читать пароль и логин, которые до этого ввели в настройках и который хранится в реестре в определенном формате.
Так вот, так как tscon.exe это консольная программа и запускается с аргументами, то пароль, сохраненный в переменную VB программы нельзя поместить в команде для программы tscon.exe
Например так, ранее мы поместили пароль в переменную UserPassword:

Код:
Dim UserPassword As String
UserPassword = ...

Private Sub Command1_Click()
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """tscon.exe""""""  /password:UserPassword" 'Как сделать,что бы эта переменная воспринималась?
End Sub

p.s. возможно это будет интересно еще кому то (судя по запросам в гугле) и можно будет сделать ресурс тут
 
Последнее редактирование:
Проект и так голый...ошибка на строке:
Если перевести на язык командной строки, то эта строка будет:
Код:
"tscon.exe""" /password:12345
Разумеется, что это некорректно.

Так вот, так как tscon.exe это консольная программа и запускается с аргументами, то пароль, сохраненный в переменную VB программы нельзя поместить в команде для программы tscon.exe
Например так, ранее мы поместили пароль в переменную UserPassword:

Код:
WshShell.Run "tscon.exe /password:" & UserPassword
 
Если перевести на язык командной строки, то эта строка будет:
Ну а почему тогда на некоторых компах работает?
Как ты пишешь - не работает сама команда командной строки.
К количеству кавычек пришел опытным путем - все пробелы при выполнении WshShell.Run передаются только так, если убрать кавычки, то команда не сработает
Командная строка, получается, видит:
tscon.exe - пробел - /password: & UserPassword

P.S. так из переменной данные не читаются.
Я думаю потому что сохраняется она в среде vb6 а в cmd не объявлена...
 
Последнее редактирование:
Я думаю потому что сохраняется она в среде vb6 а в cmd не объявлена...
При чём тут переменные CMD к переменным VB6. У CMD нет своих переменных, она использует переменные окружения. В VB6 такие раскрываются через Environ(), если они глобальные или наследованы.

Ну а почему тогда на некоторых компах работает?
Понятия не имею.
Если команда составлена криво. Чего ты ожидаешь?
Кавычек должно быть столько, сколько нужно, а не столько как ты хочешь.

Командная строка, получается, видит:
tscon.exe - пробел - /password: & UserPassword
Бред какой-то пишешь. Опять кучу лишних кавычек нагородил?
 
Последнее редактирование модератором:
Вот верный вариант:
WshShell.Run "C:\Windows\System32\tscon.exe """" /password:" & NamePassword
 
Последнее редактирование:
Т.е. кавычки нужны, чтобы задать пустое имя сеанса?
И с пустым именем у тебя принимает?
 
Конечно принимает - оно же соответствует тому, что есть по факту.

1540482458593.png


Неактивный сеанс указывается без имени, а вот ID - непостоянная величина.
Есть еще вариант сессии акка, подключенного в домене - но на сейчас это не нужно, да и для тех, кому может пригодиться такая программа это тем более не нужно...
Если интересно - можешь тестовый вариант заценить.
Запуск - от имени администратора.
На сейчас уже должна быть запущена параллельная сессия, в будущем это все будет делать программа.
Настроек тоже будет больше, думаю как лучше реализовать централизованное управление.

Но - вопрос темы изначальный вернулся.
На рабочем компьютере ошибка из первого поста... пока мысли такие: или проблемы системы или кривая среда разработки.
Завтра появлюсь там попробую другую накатить.
 

Вложения

  • Проект1.zip
    5.1 KB · Просмотры: 2
Последнее редактирование:
Можно просто Shell ...

Неактивный сеанс указывается без имени, а вот ID - непостоянная величина.
По-моему на скриншоте выше не имя сеанса, а его тип.

Ошибка -2147024894 обозначает, что система не может найти указанный файл.

Она его не находит из-за файлового редиректора. Тебе нужно указывать путь через алиас "SysNative":
Код:
shell "c:\windows\sysnative\tscon.exe """" /password:" & NamePassword
 
Последнее редактирование модератором:
По-моему на скриншоте выше не имя сеанса, а его тип.
Ну мне изначально тоже так казалось, но справка, черт ее, говорит иначе)

Код:
  <пользователь>    Имя пользователя.
  <имя сеанса>      Имя сеанса.
  <ID сеанса>       Идентификатор сеанса.
  /SERVER:<сервер>  Опрашиваемый сервер (по умолчанию - текущий).

Ошибка -2147024894 обозначает, что система не может найти указанный файл.
Я когда гуглил тоже про это читал, но если то же самое делать просто из командной строки - без проблем.
Поэтому и решил, что проблема может быть в самом образе VB, я решил скинуть скомпиллированый вариант и попробовать на проблемном компе.
Тогда точно будет ясно виновна ли среда разработки.

Чертовщина, короче.
Если найду решение / ответ - напишу...
 
В общем временное решение:
Что то блокирует доступ, невзирая на разрешения.
Выход: копия утилиты в другое место.
 
Я когда гуглил тоже про это читал, но если то же самое делать просто из командной строки - без проблем.
Ну дык, ты какую командную строку запускал 64-битную или 32-битную? Не забывай, что все программы в VB6 32-битные и в 64-битной ОС на них действуют все возможные переадресации и + ещё и виртуализации, если ты не пользуешься манифестом.

Ну мне изначально тоже так казалось, но справка, черт ее, говорит иначе)
Справку я и сам читал, и там написано указать имя сеанса или его идентификатор, но ты указываешь пустое имя. Какое по-твоему должно быть поведение у утилиты tscon? Неопределённое. Как получать идентификаторы сеансов расписано в этой теме: How to query a user's session id under Windows?

Ты нормально укажи всё по правилам, например:
Код:
shell "c:\windows\sysnative\tscon.exe 2 /password:" & NamePassword
или
Код:
shell "c:\windows\system32\tscon.exe 2 /password:" & NamePassword
если винда 32-битная
и правильную цифру укажи. На скриншоте выше ты вообще не можешь перейти в какой-либо сеанс. У тебя только 2 - интерактивный (пользователь fire), и консольный. Переход возможен только между двумя интерактивными (за неким исключением со службой интерактивного обнаружения или если ты в XP). Т.е. тебе нужно создать учётки и войти по крайней мере хотя бы двумя пользователями, чтобы это работало.

Если ты хочешь залогиниться под пользователем, который ещё не вошел в систему, то это делается по-другому.
 
Последнее редактирование:
Если ты хочешь залогиниться под пользователем, который ещё не вошел в систему, то это делается по-другому.
Это как?
Изначально меня интересовал вопрос, как выйти из одной учетной записи полностью и войти под другой программно.
Способов, кроме как переход между параллельными сессиями через tscon или послать комбинацию win+l не нашел....

Какое по-твоему должно быть поведение у утилиты tscon? Неопределённое.
Если юзера всего два то и переключаться будет во второй, хотя ты тут прав - это неграмотно было бы в плане реализации.
Посмотрю как определить ID по логину.

По всем остальным вопросам - вроде все понял, все работает, спасибо.
 
Ну да, в принципе, кроме входа в учетку, в которую вход не выполнен.
Как я понял, можно выполнять какие либо операции от имени пользователя, который не вошел в систему, а запустить его учетную запись из под другой не удалось пока.
Хотя, если можно проверить пару логин-пароль для неактивной учетки, то мне кажется и запустить тоже можно.
 
Последнее редактирование:
Назад
Сверху Снизу