Вроде бы простая задача...

 

Страницы

Аватар пользователя dol
Потому я и предложил проверку ярлыков при запуске программы...

Для всех юзеров можно разместить ярлыкb в папку С:\Doc&Settings\Default User\Desktop и С:\Doc&Settings\Default User\Start menu\Programs\Startup

Аватар пользователя Слава
Я так понимаю красивое решение задачи - это получить адрес вызвавшего приложение ярлыка средствами WINAPI. Что-то вроде ExtractFilePath(Application->ExeName) но для ярлыка.
Аватар пользователя dol
Из самой программы в принципе нельзя узнать какой ярлык её запустил(эсли не использовать параметры запуска - ключи...).
Аватар пользователя Savely
>Из самой программы в принципе нельзя узнать какой ярлык её запустил

Are you sure? Насчет "в принципе"?

Аватар пользователя dol
Ну да. Ярлык не передаёт в Апп путь где он(ярлык) находится. Средства винапи тоже не помогут. Разве что написать хукер, который следит за событиями...

Без ключа не никак.

Аватар пользователя mike
Думалось, что поле "время последнего доступа" отражает факт запуска, и имеется простое решение задачи без параметра в командной строке. Поэтому и понадобился формат lnk. В реестре есть фичка [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem]

"NtfsDisableLastAccessUpdate"=dword:1; если отключить, то поле "время последнего доступа" в ярлыке будет меняться или нет?

Аватар пользователя Макс Курмаз
Ну вот и подошли к решению: как узнать, кто породил наш процесс? Может, можно все-таки узнать имя ярлыка?
Аватар пользователя Sens
2 mike (old student):

Если для ярлыка оставить пустым поле "Рабочая папка", то из прогарммы можно получить текущий каталог с помощью WinAPI функции GetCurrentDirectory, а это и будет имено тот каталог, где лежит ярлык :)

> При запуске через ярлык с рабстола или через такой же ярлык из дира автозагрузки, мы получим одно и то же. :(

Специально проверил, GetCurrentDirectory возвращает разные значения.

> Поведение софта, запущенного из автозагрузки и запущенного вручную, должно отличаться...

Для автозапуска программы можно обойтись и без помещения ярлыка в Startup folder, если прописать путь к exe-шнику в реестре в

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

или в

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

в строке с полным путем к exe-файлу можно указать и параметр, который будет передаваться программе.

инфа по ключам

http://www.compdoc.ru/os/windows/autoloadxp/

Аватар пользователя Narthex
Еще вариант определения контекста запуска проги - по имени родительского процесса.

Теория: если прога запускается ярлыком с рабочего стола или из автозагрузки, то родительских процесс - explorer.exe, если из Total Commander, то totalcmd.exe, если из консоли, то cmd.exe.

Идея состоит в том, чтобы в автозагрузку запихнуть ярлык на батник, который запускает прогу. Тогда из автозагрузки прога запустится из процесса cmd.exe, а по ярлыку на раб. столе - из процесса explorer.exe. Остается проверить имя родительского процесса после старта проги.

Пример батника:

cd "C:\Users\Narthex\Documents\Visual Studio 2008\Projects\temp++\Debug\"

temp++.exe

Пример кода (определяет лишь PID, для имен требуется модификация, но идея и без этого ясна):

#include <stdio.h>

#include <tchar.h>

#include <conio.h>

#include <windows.h>

#include <tlhelp32.h>

#include <WinNT.h>

int main(int argc, char *argv[])

{

int pid = -1;

HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

HANDLE processInfo;

PROCESSENTRY32 pe = { 0 };

pe.dwSize = sizeof(PROCESSENTRY32);

if (argc > 1) {

pid = atoi(argv[1]);

} else {

pid = GetCurrentProcessId();

}

processInfo = GetCurrentProcess();

if( Process32First(h, &pe)) {

do {

if (pe.th32ProcessID == pid) {

printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);

}

} while( Process32Next(h, &pe));

}

CloseHandle(h);

getch();

}

Взято с http://stackoverflow.com/questions/185254/how-can-a-win32-process-get-the-pid-of-its-parent.

Аватар пользователя mike
>Из самой программы в принципе нельзя узнать какой ярлык её запустил (эсли не использовать параметры запуска - ключи...).

Итак, это утверждение ложно. Браво Sens!

Аватар пользователя dol
Признаю поражение...

К стати не подскажете как запустить программу под другим пользователем, из самой программы, тобиш сделать Run As не используя Launcher

Аватар пользователя Savely
C UAC боремся или более абстракная задача?
Аватар пользователя dol
Проблемма в том, что ПК подключен к доменной сети, он загружаєтся под локальнім админом, которій не может війти в домен, программа должна віполнятся под другим юзером, для того чтобі иметь доступ к сетевім ресурсам... Я решил задачу используя Launcher. Но можно ли всё это делать без использования стороннего ехе??
Аватар пользователя dol
sorry:) забыл поменять раскладку:)
Аватар пользователя Savely
Эмм... runas из командной строки не катит?
Аватар пользователя dol
2 Savely

Нет, потому что я использую логин и пароль сервисного пользователя, который не должны видеть простые юзеры...

Аватар пользователя Savely
Ключевое слово для поиска - impersonate.
Аватар пользователя dol
2 Savely

Спасибо, за помощь.

Когда то я пробовал этот метод, но в диспетчере задач имя юзера не менялось... Сейчас попробовал создать файл, и он действительно пренадлежит юзеру, под которым я логинюсь. Вот линк на проект который я нашел:

http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

Аватар пользователя Savely
В диспетчере оно и не должно меняться. Имперсонация - это все-таки не перелогинивание, а возможность доступа к ресурсу с "чужими" правами.
Аватар пользователя dol
2 Savely

В принципе мне не важно что пишет Диспетчер, главное чтобы права у программы были не те :).

Ещё раз спасибо!

Страницы