Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
1

Как происходит вызов одного приложения другим?

25.07.2015, 08:03. Показов 992. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Пишу набор консольных утилит, столкнулся с проблемой того, что функция API копирования файла срабатывает при запуске приложения из среды VS и при запуске .bat файлом, но не срабатывает при вызове из другого приложения с помощью CreateProcess. В чем может быть причина такого поведения?

коды обоих приложений:

Вызываемое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <Windows.h>
#include <iostream>
 
 
 
BOOL IsRunAsAdmin()
{
    BOOL fIsRunAsAdmin = FALSE;
    DWORD dwError = ERROR_SUCCESS;
    PSID pAdministratorsGroup = NULL;
 
    // Allocate and initialize a SID of the administrators group.
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    if (!AllocateAndInitializeSid(
        &NtAuthority, 
        2, 
        SECURITY_BUILTIN_DOMAIN_RID, 
        DOMAIN_ALIAS_RID_ADMINS, 
        0, 0, 0, 0, 0, 0, 
        &pAdministratorsGroup))
    {
        dwError = GetLastError();
        goto Cleanup;
    }
 
    // Determine whether the SID of administrators group is enabled in 
    // the primary access token of the process.
    if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin))
    {
        dwError = GetLastError();
        goto Cleanup;
    }
 
Cleanup:
    // Centralized cleanup for all allocated resources.
    if (pAdministratorsGroup)
    {
        FreeSid(pAdministratorsGroup);
        pAdministratorsGroup = NULL;
    }
 
    // Throw the error if something failed in the function.
    if (ERROR_SUCCESS != dwError)
    {
        throw dwError;
    }
 
    return fIsRunAsAdmin;
}
 
 
void OnCommand()
{   
            // Check the current process's "run as administrator" status.
            BOOL fIsRunAsAdmin;
            try
            {
                fIsRunAsAdmin = IsRunAsAdmin();
            }
            catch (DWORD dwError)
            {
                MessageBox(NULL, L"Error fIsRunAsAdmin; ", L"UAC", MB_OK);              
            }
 
            // Elevate the process if it is not run as administrator.
            if (!fIsRunAsAdmin)
            {
                wchar_t szPath[MAX_PATH];
                if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
                {
                    // Launch itself as administrator.
                    SHELLEXECUTEINFO sei = { sizeof(sei) };
                    sei.lpVerb = L"runas";
                    sei.lpFile = szPath;
                    sei.hwnd = GetConsoleWindow();
                    sei.nShow = SW_NORMAL;
 
                    if (!ShellExecuteEx(&sei))
                    {
                        DWORD dwError = GetLastError();
                        if (dwError == ERROR_CANCELLED)
                        {
                            // The user refused the elevation.
                            // Do nothing ...
                        }   }
                    else
                    {   EndDialog(GetConsoleWindow(), TRUE);  // Quit itself
                    }   }  }
            else
            {
                MessageBox(GetConsoleWindow(), L"The process is running as administrator", L"UAC", MB_OK);
            }
        }   
 
 
int wmain(int argc, wchar_t *argv[])
{
    std::cout << argc << std::endl;
    OnCommand();
    for ( int i = 0; i < argc ; i++)
    if (argv[i] != NULL)
    {   std::wstring s = argv[i];
        std::string d(s.begin(), s.end());
        std::cout << d.c_str() << std::endl;    }
    int i = CopyFile(argv[1], argv[2], false);
 
    system("pause");
    if (i != 0) // функция возвращает не 0 если успешно завершается.
        return 0;
    else    
        return 1;
}
Копирование в вышеуказанных случаях происходит и без повышения привелегий методом OnCommand(), так что на него акцент вероятно делать не стоит.

Вызывающее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int wmain(int argc, wchar_t *argv[])
{
    std::wstring directory;
    std::wstring path = argv[0];
    const size_t last_slash_idx = path.rfind('\\');
    if (std::string::npos != last_slash_idx)
    {
        directory = path.substr(0, last_slash_idx);
    }
 
    STARTUPINFO cif;
    ZeroMemory(&cif,sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi; 
    SECURITY_ATTRIBUTES sa;
    WCHAR cmd[128];
    std::string arg= "";
    std::cin >> arg;
 
    if(arg == "1" )
    {   directory += L"\\CopyFile.exe";
        lstrcpy(cmd,L"C:\\SourceDirectory\\2.txt C:\\DestDirectory\\2.txt");
        std::cout << "Процесса создание: " << CreateProcess(directory.c_str(), cmd, NULL,
            NULL, true, HIGH_PRIORITY_CLASS, NULL, NULL, &cif, &pi ) << std::endl;  }
 
    if(arg == "2" )
    {   directory += L"\\CopyCatalog.exe";
        lstrcpy(cmd,L"C:\\SourceDirectory C:\\DestDirectory -0");
        std::cout << "Процесса создание: " << CreateProcess(directory.c_str(), cmd, NULL,
            NULL, true, HIGH_PRIORITY_CLASS, NULL, NULL, &cif, &pi ) << std::endl;  }
 
    return 0;
}
0
25.07.2015, 08:03
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2015, 08:03
Ответы с готовыми решениями:

Считывание данных одного приложения другим
Здравствуйте, подскажите пожалуйста. Передо мной стоит следующая задача. У меня есть основное приложение на С Builder, которое...

Вызов одного приложения из других
Доброго времени суток дамы (уж если таковые тут имеются) и господа (что более вероятно)! Столкнулся я вот с какой проблемой - приступив к...

Как присвоить значение одного объекта в метод вызванный другим объектом, при том что они в одном классе
Здравствуйте, суть задания такова, создать конструктор без параметра который заполняет 10 элементов множества, и с параметром который...

8
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.07.2015, 09:42 2
1. Что возвращает CreateProcess ?
2. Если FALSE, какой при этом код GetLastError() ?
3. Что возвращает CopyFile ?
4. Если FALSE, какой при этом код GetLastError() ?
5. Зачем в CreateProcess стоит флаг HIGH_PRIORITY_CLASS ? Достаточно ведь NORMAL_PRIORITY_CLASS.
6. Зачем в CreateProcess стоит аргумент bInheritHandles = TRUE ?
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
25.07.2015, 10:40  [ТС] 3
CreateProcess успешно выполняется (возвращает 1), выполняется CopyFile с результатом 0;
Цитата Сообщение от Убежденный Посмотреть сообщение
Зачем в CreateProcess стоит флаг HIGH_PRIORITY_CLASS ? Достаточно ведь NORMAL_PRIORITY_CLASS.
Из логики "много не мало", сменил на NORMAL не помогло.
Цитата Сообщение от Убежденный Посмотреть сообщение
Зачем в CreateProcess стоит аргумент bInheritHandles = TRUE ?
По незнанию поставил. Атрибут позволяет наследовать все хендлы которыми оперирует приложение?
Сменил на false - не помогло.

Добавлено через 19 минут
В чем разница между такими запусками приложения? Что именно происходит при вызове CreateProcess ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.07.2015, 11:06 4
Цитата Сообщение от VoltDeMar Посмотреть сообщение
выполняется CopyFile с результатом 0;
Что при этом возвращает GetLastError ?

Цитата Сообщение от VoltDeMar Посмотреть сообщение
Из логики "много не мало", сменил на NORMAL не помогло.
Оно и не должно было помочь. Просто priority процесса злоупотреблять не стоит.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
По незнанию поставил. Атрибут позволяет наследовать все хендлы которыми оперирует приложение?
Нет все, но те, для которых было включено наследование.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
25.07.2015, 11:16  [ТС] 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Что при этом возвращает GetLastError ?
У меня появляется два экземпляра приложения, второй при повышении привилегий методом OnCommand();
Так вот первый показывает GetLastError: 2, а второй 3.

Добавлено через 2 минуты
Неправильная кодировка?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.07.2015, 11:21 6
2 и 3 - это "The system cannot find the file specified" и "The system cannot find the path specified".
Вопрос только в том, что именно передается в командной строке в оба приложения.
Сделать бы какую распечатку да посмотреть.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
25.07.2015, 11:25  [ТС] 7
В вызываемом приложении перечисление переданных аргументов при разных привилегиях разный вывод, почему?
Миниатюры
Как происходит вызов одного приложения другим?  
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
25.07.2015, 11:27  [ТС] 8
Сменил путь назначения
C++
1
2
3
4
5
if(arg == "1" )
    {   directory += L"\\CopyFile.exe";
        lstrcpy(cmd,L"C:\\SourceDirectory\\2.txt C:\\DestDirectory");
        std::cout << "Process creation: " << CreateProcess(directory.c_str(), cmd, NULL,
            NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL, &cif, &pi ) << std::endl;    }
Теперь первое приложение выдает ошибку доступа 5. Второе по прежнему 3.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.07.2015, 11:32 9
Цитата Сообщение от VoltDeMar Посмотреть сообщение
В вызываемом приложении перечисление переданных аргументов при разных привилегиях разный вывод, почему?
Наверное потому, что командная строка в elevated-приложение
не была передана (см. SHELLEXECUTEINFO, поле lpParameters).
1
25.07.2015, 11:32
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2015, 11:32
Помогаю со студенческими работами здесь

Вызов одного приложения из другого
Есть 2 проекта. При нажатии кнопки в первом проекте нужно запустить exe файл со вторым и передать туда строку с адресом. Как можно...

Как сделать так, что при совпадении одного объекта с другим происходило удаление одного из них
Подскажите, как сделать так, что при совпадении одного объекта с другим происходило удаление одного из них. Вкратце. Есть несколько...

Вызов одного Flash приложения из другого Flash приложения
Разрабатывается несколько Флэш приложений (роликов), для них необходимо главное меню, где в зависимости от нажатой кнопки должен...

Как происходит вызов asm функций из C++ кода?
Всем привет. У меня есть функции написанные на АСМе (MASM) расскажите пожалуйста, или подкиньте инфы как вызывать функции написанные на...

Как убрать затирание одного значка другим?
Если поставить один объект на расстояние менее 256px рядом с другим (при максимальном размере иконок), то значок одного объекта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Ошибка "Cleartext HTTP traffic not permitted" в Android
hw_wired 13.02.2025
При разработке Android-приложений можно столнуться с неприятной ошибкой "Cleartext HTTP traffic not permitted", которая может серьезно затруднить отладку и тестирование. Эта проблема особенно. . .
Изменение версии по умолчанию в NVM
hw_wired 13.02.2025
Node Version Manager, или коротко NVM - незаменимый инструмент для разработчиков, использующих Node. js. Многие сталкивались с ситуацией, когда разные проекты требуют различных версий Node. js,. . .
Переименование коммита в Git (локального и удаленного)
hw_wired 13.02.2025
Git как система контроля версий предоставляет разработчикам множество средств для управления этой историей, и одним из таких важных средств является возможность изменения сообщений коммитов. Но зачем. . .
Отличия Promise и Observable в Angular
hw_wired 13.02.2025
В веб-разработки асинхронные операции стали неотъемлимой частью почти каждого приложения. Ведь согласитесь, было бы странно, если бы при каждом запросе к серверу или при обработке больших объемов. . .
Сравнение NPM, Gulp, Webpack, Bower, Grunt и Browserify
hw_wired 13.02.2025
В современной веб-разработке существует множество средств сборки и управления зависимостями проектов, каждое из которых решает определенные задачи и имеет свои особенности. Когда я начинаю новый. . .
Отличия AddTransient, AddScoped и AddSingleton в ASP.Net Core DI
hw_wired 13.02.2025
В современной разработке веб-приложений на платформе ASP. NET Core правильное управление зависимостями играет ключевую роль в создании надежного и производительного кода. Фреймворк предоставляет три. . .
Отличия между venv, pyenv, pyvenv, virtualenv, pipenv, conda, virtualenvwrapp­­er, poetry и другими в Python
hw_wired 13.02.2025
В Python существует множество средств для управления зависимостями и виртуальными окружениями, что порой вызывает замешательство даже у опытных разработчиков. Каждый инструмент создавался для решения. . .
Навигация с помощью React Router
hw_wired 13.02.2025
React Router - это наиболее распространенное средство для создания навигации в React-приложениях, без которого сложно представить современную веб-разработку. Когда мы разрабатываем сложное. . .
Ошибка "error:0308010C­­:dig­ital envelope routines::unsup­­ported"
hw_wired 13.02.2025
Если вы сталкиваетесь с ошибкой "error:0308010C:digital envelope routines::unsupported" при разработке Node. js приложений, то наверняка уже успели поломать голову над её решением. Эта коварная ошибка. . .
Подключение к контейнеру Docker и работа с его содержимым
hw_wired 13.02.2025
В мире современной разработки контейнеры Docker изменили подход к созданию, развертыванию и масштабированию приложений. Эта технология позволяет упаковать приложение со всеми его зависимостями в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru