Форум программистов, компьютерный форум CyberForum.ru

Исправить код утилит для обновления - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычисления на удаленной станции http://www.cyberforum.ru/cpp/thread1509629.html
Доброго времени суток, уважаемые форумчане. Возникла некая необходимость по удаленному расчету данных. В качестве условий задачи - персональный комп, как источник данных, посылает по заданному айпишнику набор команд в виде <32-бита адрес/ 32-бита данные>. В свою очередь на приемнике данных, некой плате, крутится программа, которая эти данные должна принять, обработать, и "выплюнуть" на...
C++ Литература по сокетам Доброго времен суток! Уважаемые посетители cyberforum! Посоветуйте пожалуйста литературу по программированию сокетов в С++ Заранее спасибо!) http://www.cyberforum.ru/cpp/thread1509227.html
C++ Как получить список компьютеров в домене ?
Здравствуйте. Как получить список компьютеров в домене? Какими инструментами нужно пользоваться чтобы получить доступ к расшареным папкам?
Широковещательный запрос с использованием broadcast C++
Как отправить широковещательный запрос с использованием broadcast и и получить в ответ ip адреса включенных в сеть компьютеров?
C++ Поиск ip адресов, на которых запущена определенная программа http://www.cyberforum.ru/cpp/thread1506123.html
Здравствуйте. Необходимо написать программу, которая просканирует локальную сеть, опередит, на каком компьютере запущен процесс (допустим word.exe) и в диалоговом окне выведет на печать ip этих компьютеров.
C++ Проброс порта для чего и в какой ситуации нужно делать проброс порта??Почему когда передаешь данный по tcp на сервер который находится в другом городе или в другой локальной сети нужно пробрасывать порт?? с чем это связано можете качественно обьяснить этот момент?? подробнее

Показать сообщение отдельно
VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015

Исправить код утилит для обновления - C++

04.08.2015, 16:00. Просмотров 361. Ответов 0
Метки (Все метки)

Здравствуйте.
Пишу набор утилит для обновления.
Тут 3 утилиты:

Утилита для копирования:

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <Windows.h>
#include <iostream>
#include <cstdlib>
#include <sys/stat.h>
 
 
 
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(int argc, wchar_t *argv[])
{   
            // 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;
                    std::wstring s;
 
                    if (argc == 2)
                    {
                        std::cout << "Chosen argc length evaluate: 2"<< std::endl;  
                        s = argv[0] ;
                        s +=  L" ";
                        s += argv[1]; 
                    }
 
                    if(argc == 3)
                    {
                        std::cout << "Chosen argc length evaluate : 3"<< std::endl;  
                        std::wstring s = argv[1] ;
                        s +=  L" ";
                        s += argv[2]; 
                    }
 
                    sei.lpParameters = s.c_str(); 
 
                    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);
            }   }   
 
 
bool IsPermissionsEnough ()
{   SID_IDENTIFIER_AUTHORITY NtAuthority ;
    GetSidIdentifierAuthority(&NtAuthority);
    return true;}
 
 
int wmain(int argc, wchar_t *argv[])
{
    GUID identifier ;
    CoCreateGuid(&identifier);
    IsPermissionsEnough();
    std::cout << "Count of parameters: " << argc << std::endl;
    std::cout << "argv[]: "  << std::endl;
    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 <<" Argv "<< i << " : " << d.c_str() << std::endl;}
    std::cout << "Before OnCommand " << GetCurrentProcessId() << std::endl;
 
    if (argc == 3) 
    {   OnCommand(argc, argv);  }   
    std::cout << "After OnCommand 1 " << GetCurrentProcessId() << std::endl;    
    int i = -1;
 
    if (argc == 2)
    {   std::cout << "Chosen argc length: 2."<< " Copiyng 0 & 1 "<< std::endl;  
        i = CopyFile(argv[0], argv[1], false);
        std::cout << "Result: "<< i << std::endl;
        std::cout << "After OnCommand 2 " << GetCurrentProcessId() << std::endl;    }
 
    if(argc ==3)
    {   std::cout << "Chosen argc length: 3."<< " Copiyng 1 & 2 "<< std::endl;  
        i = CopyFile(argv[1], argv[2], false);
        std::cout << "Result: "<< i << std::endl;
        std::cout << "After OnCommand 2 " << GetCurrentProcessId() << std::endl;    }   
 
    else 
    {std::cout << " Argc : " << argc << std::endl;
        MessageBox(GetConsoleWindow(), L"i was not initialised " + argc, L"UAC", MB_OK);}
    
    int j = GetLastError();
    std::cout << "GetLastError: "<< j << std::endl;
 
    system("pause");
    if (i != 0) // функция возвращает не 0 если успешно завершается.
ret0 :    return 0;
    else    
        return 1;
}

Утилита должна копировать файл, при этом запуститься со всеми необходимыми правами.
Этот код выполняет копирование только родительским экземпляром. Тот который запускается с новыми правами не копирует.
При этом мне нужно чтобы в случае если запустился новый экземпляр приложения чтобы старый закрылся. Как это сделать?


Копирование каталога:

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
#include <string>
#include <windows.h>
#include <tchar.h>
#include <iostream>
 
int  CopyCatalog(std::wstring const & Spath, std::wstring const & Dpath)
{      
    try 
    {
        std::wstring const searchMask = Spath + L"\\*.*";    
        WIN32_FIND_DATA FindFileData; 
        HANDLE hf = FindFirstFile(searchMask.c_str(), &FindFileData);
  
        if (hf != INVALID_HANDLE_VALUE)
        { do
            {  if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если находим дирректорию 
                {   std::cout << "Directory : " << FindFileData.cFileName << " was skiped." << std::endl;}
                else
                {   std::wstring name = Spath + L"\\" + FindFileData.cFileName;
                    CopyFile(name.c_str(), Dpath.c_str(), false);   }   } 
            while (FindNextFile(hf, &FindFileData) != NULL); // ищем следующий файл 
        }
        else
        {   std::cout << "No files in folder. " << std::endl;   }       
        return 0;   }
    catch(...)
    {
        std::cout << "Coping unsuccessful." << std::endl;
        return -1;
    }
}
 
 
int DeleteDirectory( std::wstring const & refcstrRootDirectory)
{   try 
         {
             TCHAR *var = new TCHAR[refcstrRootDirectory.length() + 2];
             _tcscpy(var, refcstrRootDirectory.c_str());
             var[refcstrRootDirectory.length() + 1] = _T('\0');
 
            SHFILEOPSTRUCT shfo={0};
            shfo.wFunc=FO_DELETE;
            shfo.pFrom = var;
            shfo.fFlags=FOF_NOCONFIRMATION;
            shfo.fAnyOperationsAborted=false;
            shfo.hNameMappings=NULL;
            shfo.lpszProgressTitle=NULL;
 
            return SHFileOperation(&shfo);
     }
    catch(...)
    {
        std::cout << "Deleting unsuccessful." << std::endl;
        return -1;
    }
}
 
 
int CopyDirectory(std::wstring source, std::wstring dest )
{
    try{
        SHFILEOPSTRUCT sf={0};      
        TCHAR *s = new TCHAR[source.length() + 2];
         _tcscpy(s, source.c_str());                
         wcscat(s,L"\\*.*");
 
         s[source.length() + 1] = _T('\0');
 
         TCHAR *d = new TCHAR[dest.length() + 2];
         _tcscpy(d, dest.c_str());
         d[dest.length() + 1] = _T('\0');
        
        sf.pFrom = s;
        sf.pTo = d;
        sf.wFunc = FO_COPY;
        sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT | FOF_FILESONLY;
        return  SHFileOperation(&sf);
    }
    catch (...)
    {return 0;}
}
 
 
 /// Первый аргумент - исходный путь, второй аргумент - путь назначения,
/// Третий аргумент - флаг (перезапись (-0) / дозапись (-1)). 
 
int wmain(int argc, wchar_t *argv[])
{
    wchar_t *arr[2];
    arr[0] = L"-0";
    arr[1] = L"-1";
 
    if(wcscmp(argv[3], arr[0]) == 0)
    {  DeleteDirectory(argv[2]);
       return CopyDirectory(argv[1], argv[2]);}
    if(wcscmp(argv[3], arr[1]) == 0)
    {   return CopyDirectory(argv[1], argv[2]);   }
    else
    {   std::wcout << " Unknown parametr: " << argv[3] << std::endl;
        system("pause");
        return -1;  }
}
Этот код только создает папку, но не копирует файлы внутри.

Копирование дерева файлов и папок:
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
#include <string>
#include <windows.h>
#include <tchar.h>
#include "Source.cpp"
#include <iostream>
#include <SDKDDKVer.h>
 
int CopyDirectory(std::wstring source, std::wstring dest )
{
    try{    SHFILEOPSTRUCT sf={0};      
        TCHAR *s = new TCHAR[source.length() + 2];
         _tcscpy(s, source.c_str());                
         wcscat(s,L"\\*.*");
         s[source.length() + 1] = _T('\0');
         TCHAR *d = new TCHAR[dest.length() + 2];
         _tcscpy(d, dest.c_str());
         d[dest.length() + 1] = _T('\0');       
        sf.pFrom = s;
        sf.pTo = d;
        sf.wFunc = FO_COPY;
        sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT | FOF_FILESONLY;
        return  SHFileOperation(&sf);   }
    catch (...)
    {return 0;}}
 
int wmain(int argc, wchar_t *argv[])
{
    DWORD i = CopyDirectory(argv[1], argv[2]);  
    return i;
}
Этот код только создает папку, но не копирует файлы внутри.


Помогите фиксануть и оптимизировать/рационализировать это.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru