Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Kerberos

Добрый день!

Никак не получается установить kerberos 1.2.5 на версию python 2.5.3. Ошибка следующего содержания:

Python
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
 File "C:\Python35\lib\distutils\_msvccompiler.py", line 382, in compile
 
    self.spawn(args)
 
  File "C:\Python35\lib\distutils\_msvccompiler.py", line 501, in spawn
 
    return super().spawn(cmd)
 
  File "C:\Python35\lib\distutils\ccompiler.py", line 909, in spawn
 
    spawn(cmd, dry_run=self.dry_run)
 
  File "C:\Python35\lib\distutils\spawn.py", line 38, in spawn
 
    _spawn_nt(cmd, search_path, dry_run=dry_run)
 
  File "C:\Python35\lib\distutils\spawn.py", line 65, in _spawn_nt
 
    log.info(' '.join([executable] + cmd[1:]))
 
  File "C:\Python35\lib\distutils\log.py", line 44, in info
 
    self._log(INFO, msg, args)
 
  File "C:\Python35\lib\distutils\log.py", line 34, in _log
 
    stream.write('%s\n' % msg)
 
  File "C:\Python35\lib\encodings\cp866.py", line 19, in encode
 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 442-443:
 
character maps to <undefined>
В какую сторону смотреть?
Ответ: В итоге так и ничего не получилось, то gssapi требует, то еще чего-нибудь.

Может есть какие-то другие варианты.
Необходимо реализовать сквозную авторизацию в домене средствами http. Какой модуль лучше использовать?
Вопрос: Подключение PHP к mysql (сборка)

структура файлов такая..
php.ini такой :
extension_dir = "./lib/"
extension=php_curl.dll
extension=php_mssql.dll
версия php_mssql.dll совпадает с версией в phpinfo
код написан такой:
PHP
1
2
3
4
set_time_limit(0);
include('options.php');
require_once('lib/class.php');
mysql_connect($server, $user, $password)
ошибка вот такая: Запуск программы не возможен так как отсутствует ntwdblib.dll
при добавлении данной библитотеки выскакиевает прежняя ощибка вот такая
Fatal error: Call to undefined function mysql_connect()

и еще написано что невозможно определить динамическую библиотеку mssql.dll.

phpinfo()

прикрепленный

Расскажите как правильно собрать php или скачать уже готовый чтобы в нем уже все дллки были..
Качаю архив c php.net там он полный разных папок и файлов. я так понимаю сборку надо по нему делать.. только как?? я не знаю. Кому не сложно расскажите по подробнее.. Зарание СПАСИБО
Ответ: Dmitry, Спасибо! Немогу найти где скачать dll именно этой версии.. 5.2.6 если не сложно расскажите как собирать php для написания Сценарий командной строки.. я скачал с сайта php.net php что делать дальше??
Вопрос: Имперсонация и делегирование asp.net проекта

Всем доброго времени суток. Возможно данный вопрос стоит адресовать специалистам в области asp.net, тем не менее он ощутимо затрагивает настройку SQL SERVER.

Наша компания занимается разработкой многослойного приложения, включающего в себя:
- Desktop клиент;
- Web APi сервер приложений. - AppServer
- БД, развернутая на MS SQL Server

Клиентское приложение практически выполняет функцию отображения (wpf мордочка), обработка данных из БД и также бизнес логика реализованы в AppServer. Некоторая сложная логика, включающая множество join операций вынесена на уровень БД в функции и хранимые процедуры и клиент обращается к ним напрямую (в тех местах, где "проседает" производительность по времени).

Идея взаимодействия такова: пользователь работает с клиентом под своей доменной учетной записью (не силен в данном вопросе, но знаю, что все учетки, а также их права хранятся на уровне БД, + Active directory). Пользователь обращается к AppServer, к примеру хочет отобразить некие данные в таблице. AppServer соответственно делает запрос к БД и вытаскивает нужные данные.

НО! Важно, чтобы AppServer выполнял этот запрос от имени учетки пользователя, который работает с клиентом, в противном случае политика раздачи прав на объекты в БД не имеет смысла. Т.е. нужно реализовать механизм "сквозной авторизации" на SQL Server через AppServer.

Поиски решения привели к понятиям имперсонации и делегирования в asp.net проекте и к данной статье в частности:
[url=] [/url]

сделал соответствующие настройки в web.config, установил в IIS Negotiate:Kerberos и убрал Kernel-mode authentification, админ соответственно настроил соответствующим образом Active Directory, установив "Trust this computer for delegation to any service", то есть, по сути, сделал делегирование enable.

Пытаюсь проверить работоспособность делегирования через тестовый проектик: создал Web API проект, добавил тестовый метод со следующим кодом:

string userName = "";
            string userId = "";

            if (HttpContext.Current != null && HttpContext.Current.User != null &&
                HttpContext.Current.User.Identity.Name != null)
            {
                userName = HttpContext.Current.User.Identity.Name;
                userId = HttpContext.Current.User.Identity.AuthenticationType;
            }

            return userName;


чтобы проверить, авторизован ли я на сервисе, и запаблишил этот сервис

Учетку из http контекста данный метод возвращает верно, то есть я делаю вывод, что на сервисе я авторизован. Далее я делаю тестовый метод для обращения к sql server к нужной базе, данный метод должен вернуть suser_sname:

SqlConnection conn = new SqlConnection("Data Source=SERVER;Initial Catalog=Database;Integrated Security=True");
            conn.Open();
            SqlCommand com = new SqlCommand("SELECT SUSER_SNAME()", conn);
            var result = (string)com.ExecuteScalar();

            return result;


Обращаюсь в браузере к контроллеру:
В результате я получаю такую ошибку:
+

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
</ExceptionMessage>
<ExceptionType>System.Data.SqlClient.SqlException</ExceptionType>
<StackTrace>
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.Open() at TestWebApi.Controllers.ValuesController.Get() at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
</StackTrace>
</Error>


Поиск в гугл приводит меня к одним и тем же ссылкам, в которых указываются настройки, которые уже установлены. Я почти уверен, что проблема где-то в настройках IIS или Active Directiry, но к сожалению пока-что решение не найдено.

Возможно кто-то решал схожую задачу либо сталкивался с такой проблемой. Буду очень благодарен Вам за помощь!

Модератор: Тема перенесена из форума "Microsoft SQL Server".
Ответ: paranamix2,
Проверьте что установлено в Identity в Application Pool.
Вопрос: MS SQL Server, PHP, IIS, настройка WIN-аутентификации

Здравствуйте.
Не хватает ума самостоятельно решить задачу.
Сервер приложений: IIS, движок сайта на PHP.
Сервер баз данных: SQL Server 2008 R2.

На IIS в глобальной конфигурации и конфигурации сайта проверка подлинности: анонимная отключена, проверка подлинности Windows включена, Kerberos добавлен.
В конфигурации СУБД включена Win-аутентификация, соединения с БД из других приложений идут нормально (MS OLEDB Provider MSSQL Server).

Но даёт ошибку:
автор
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Ошибка входа пользователя "NT AUTHORITY\АНОНИМНЫЙ ВХОД". [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Ошибка входа пользователя "NT AUTHORITY\АНОНИМНЫЙ ВХОД"

Код PHP
$serverName = "10.1.1.1"; //сервер СУБД
$connectionInfo = array( "Database"=>"My_Database"); //в случае Win-аутентификации не требуется указание логин-пароль жи
$conn = sqlsrv_connect( $serverName, $connectionInfo) or die( print_r( sqlsrv_errors(), true));


Файл web.config
<?xml version="1.0" encoding="windows-1251"?>
<configuration>
    <system.web>
        <globalization culture="ru" enableClientBasedCulture="true" fileEncoding="windows-1251" requestEncoding="windows-1251" responseEncoding="windows-1251" responseHeaderEncoding="windows-1251" uiCulture="ru" />
<identity impersonate="true" />
<authentication mode="Windows" /> 
<authorization>    
<deny users="?" /> 
</authorization>

    </system.web>
    <system.webServer>
        <defaultDocument enabled="true" />
        <validation validateIntegratedModeConfiguration="false" />
        <directoryBrowse enabled="false" />
    </system.webServer>
</configuration>



При явном указании пары логин-пароль в настройках соединения в коде PHP ругается
автор
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Ошибка входа пользователя "my_user_name".


Подскажите, пожалуйста, в чём ошибаюсь.
Ответ: насколько пишется слитно
Вопрос: Хороший сервлет контейнер в 2016 году

На сколько понимаю вопрос уже неоднократно всплывал на форуме, но тем не менее интересно узнать состояние дел на текущий момент. На текущий момент у нас на продакшене унылый IBM WebSphere с мохнатой 6ой Java, Servlet API 2.5 и разработка в старинной IDE на базе такого же "свежего" eclipse, при этом никаких EE фич практически не используется (то есть приложение без всяких MQ, EJB и т.д.).
В общем очень хочется уйти на что-нибудь простое, удобное и так чтобы оно работало с какой-нибудь из последних версий HotSpot'а, чтобы потом в случае желания заглянуть во внутренний мир приложения не приходилось лезть в такие классные инструменты, как IBM heap dump / memory / etc analyzer, а можно было взять какой-нибудь VisualVM и заниматься решением своей проблемы, а не решением вопроса, как с этим чудом работать, для разработки была бы крайняя сборочка eclipse и наслаждаться новинками Java 8, а в ближайшем будущем Java 9. На ум приходят Tomcat, Jetty и WildFly.

В общем вопрос у кого что сейчас в продакшене и по какой причине именно это? Планируете ли переходить на что то другое? Если да, то на что и почему?

Ну и возможно, что по советуете использовать, хотелки по контейнеру:
0. Стабильная и предсказуемая работа
1. Крайняя версия HotSpot
2. Servlet 3.1
3. Интеграция с LDAP каталогом (Active Directory)
4. SSO по Kerberos (тот же Active Directory)
5. JDBC Connection Pool

Всем спасибо за ответы!
Ответ:
Blazkowicz
Penkov Vladimir


spring.jpa.open-in-view=false

Ключевая фраза "in Spring Boot documentation"


ну так я про спринг бут и говорю
Вопрос: С# обмен данными с DLL C++

Здравствуйте уважаемые ГУРУ!

Функция DLL на с++ в результате работы формирует строку типа _bstr_t
Эту строку нужно передать в код на С#

Делаю ледующим образом:
1. На С# получаю указатель на выделенный блок памяти и передаю его параметром в функцию dll на С++
2. В DLL создается строка с типом _bstr_t ID, которая преобразуется в массив char
и записывается по адресу переданному из С#в параметре

Проблема:
В С# приходит не вся строка, а только "BaseBoard="
Само значение _bstr_t BaseBoard не передается.
То есть передается только константная часть строки ID
Если передать только переменную_bstr_t BaseBoard то выскакивает исключение что передаваемое значение не может быть NULL

Хотя когда DLL функция тестируется как консольное приложение то все работает,
Переменная _bstr_t ID содержит и константную часть и значение переменной _bstr_t BaseBoard.

Помогите пожалуйста найти грабли.
Заранее благодарен всем откликнувшимся .

С#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DllImport(@"D:\\ProjectsC++\\DLL\\MyDLL\\Debug\\MyDLL.dll",
                        EntryPoint = "GetString",
                        ExactSpelling = true,
                        CallingConvention = CallingConvention.Cdecl)]
 
public static extern int GetString(IntPtr pComputerName); 
 
 
var pComputerName = Marshal.AllocHGlobal(256);
// Вызываем описанную внешнюю функцию
GetString(pComputerName, ref size);
// Переводим результат в управляемый вид
var str = Marshal.PtrToStringUni(pComputerName);
//Освобождаем выделенную память
Marshal.FreeHGlobal(pComputerName);

С++:
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
define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>#
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
 
extern "C" __declspec(dllexport)  int GetString(char *pMemory)
{
    HRESULT hres;
    // Step 1: -------------------------------------------------- 
    // Initialize COM. ------------------------------------------
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);  
    if (FAILED(hres)) 
    { 
        cout << "Failed to initialize COM library. Error code = 0x"  
            << hex << hres << endl; 
        return 1;                  // Program has failed. 
    }
    // Step 2: -------------------------------------------------- 
    // Set general COM security levels --------------------------
    hres =  CoInitializeSecurity( 
        NULL,  
        -1,                          // COM authentication 
        NULL,                        // Authentication services 
        NULL,                        // Reserved 
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication  
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation   
        NULL,                        // Authentication info 
        EOAC_NONE,                   // Additional capabilities  
        NULL                         // Reserved 
        );
    if (FAILED(hres)) 
    { 
        cout << "Failed to initialize security. Error code = 0x"  
            << hex << hres << endl; 
        CoUninitialize(); 
        return 1;                    // Program has failed. 
    }      
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    IWbemLocator *pLoc = NULL;
    hres = CoCreateInstance( 
        CLSID_WbemLocator,              
        0, 
        CLSCTX_INPROC_SERVER,  
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres)) 
    { 
        cout << "Failed to create IWbemLocator object." 
            << " Err code = 0x" 
            << hex << hres << endl; 
        CoUninitialize(); 
        return 1;                 // Program has failed. 
    }
    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method 
    IWbemServices *pSvc = NULL; 
    // Connect to the root\cimv2 namespace with 
    // the current user and obtain pointer pSvc 
    // to make IWbemServices calls. 
    hres = pLoc->ConnectServer( 
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace 
         NULL,                    // User name. NULL = current user 
         NULL,                    // User password. NULL = current 
         0,                       // Locale. NULL indicates current 
         NULL,                    // Security flags. 
         0,                       // Authority (for example, Kerberos) 
         0,                       // Context object  
         &pSvc                    // pointer to IWbemServices proxy 
         );   
 
    if (FAILED(hres)) 
    { 
        cout << "Could not connect. Error code = 0x"  
             << hex << hres << endl; 
        pLoc->Release();      
        CoUninitialize(); 
        return 1;                // Program has failed. 
    }
    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
    // Step 5: -------------------------------------------------- 
    // Set security levels on the proxy -------------------------
    hres = CoSetProxyBlanket( 
       pSvc,                        // Indicates the proxy to set 
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
       NULL,                        // Server principal name  
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx  
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx 
       NULL,                        // client identity 
       EOAC_NONE                    // proxy capabilities  
    );
 
    if (FAILED(hres)) 
    { 
        cout << "Could not set proxy blanket. Error code = 0x"  
            << hex << hres << endl; 
        pSvc->Release(); 
        pLoc->Release();      
        CoUninitialize(); 
        return 1;               // Program has failed. 
    }
  // Step 6: -------------------------------------------------- 
    // Use the IWbemServices pointer to make requests of WMI ----
  // For example, get the name of the operating system 
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery( 
        bstr_t("WQL"),  
        bstr_t("SELECT * FROM Win32_BaseBoard"), 
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,  
        NULL, 
        &pEnumerator); 
    
    if (FAILED(hres)) 
    { 
        cout << "Query for operating system name failed." 
            << " Error code = 0x"  
            << hex << hres << endl; 
        pSvc->Release(); 
        pLoc->Release(); 
        CoUninitialize(); 
        return 1;               // Program has failed.
    }
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0; 
    while (pEnumerator) 
    { 
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,  
            &pclsObj, &uReturn); 
        if(0 == uReturn) 
        { 
            break; 
        } 
        VARIANT vtProp;
        // Get the value of the Name property 
        hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);  //BSTR vtProp
    _bstr_t BaseBoard(vtProp.bstrVal);
    _bstr_t ID = "BaseBoard=" + BaseBoard; 
    [B]//преобразуем _bstr_t ID в массив char и записываем его по переданному в параметре адресу[/B]
    strcpy_s(pMemory, ID.length() + 1, (LPCSTR)ID);
 
        VariantClear(&vtProp); 
        pclsObj->Release(); 
    }
    // Cleanup 
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
    
    return 0;
}
Ответ: arbit, ну в вашем примере этой строки не было.
Кроме того, если вы объявляете функцию именно так, то её не нужно маршалить вручную - никаких указателей и прочей лабуды. Просто выплёвываете из c++ данные в виде BSTR или преобразуете из _bstr_t, а в c# получаете данные в виде System.String. Строчка с объявлением маршалинга именно для этого и нужна.
Вопрос: C++ передача данных в С# соответствие передаваемых типов

Модератор: Пользуйся тэгом SRC!

Здравствуйте уважаемые ГУРУ!

Функция DLL на с++ в результате работы формирует строку типа _bstr_t
Эту строку нужно передать в код на С#

Делаю ледующим образом:
1. На С# получаю указатель на выделенный блок памяти и передаю его параметром в функцию dll на С++
2. В DLL создается строка с типом _bstr_t ID, которая преобразуется в массив char
и записывается по адресу переданному из С#в параметре

Проблема:
В С# приходит не вся строка, а только "BaseBoard="
Само значение _bstr_t BaseBoard не передается.
То есть передается только константная часть строки ID
Если передать только переменную_bstr_t BaseBoard то выскакивает исключение что передаваемое значение не может быть NULL

Хотя когда DLL функция тестируется как консольное приложение то все работает,
Переменная _bstr_t ID содержит и константную часть и значение переменной _bstr_t BaseBoard.

Помогите пожалуйста найти грабли.
Заранее благодарен всем откликнувшимся .

В С#
[DllImport(@"D:\\ProjectsC++\\DLL\\MyDLL\\Debug\\MyDLL.dll",
                        EntryPoint = "GetString",
                        ExactSpelling = true,
                        CallingConvention = CallingConvention.Cdecl)]
 
public static extern int GetString(IntPtr pComputerName); 
 
 
var pComputerName = Marshal.AllocHGlobal(256);
// Вызываем описанную внешнюю функцию
GetString(pComputerName, ref size);
// Переводим результат в управляемый вид
var str = Marshal.PtrToStringUni(pComputerName);
//Освобождаем выделенную память
Marshal.FreeHGlobal(pComputerName);


С++:
define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>#
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
 
extern "C" __declspec(dllexport)  int GetString(char *pMemory)
{
    HRESULT hres;
    // Step 1: -------------------------------------------------- 
    // Initialize COM. ------------------------------------------
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);  
    if (FAILED(hres)) 
    { 
        cout << "Failed to initialize COM library. Error code = 0x"  
            << hex << hres << endl; 
        return 1;                  // Program has failed. 
    }
    // Step 2: -------------------------------------------------- 
    // Set general COM security levels --------------------------
    hres =  CoInitializeSecurity( 
        NULL,  
        -1,                          // COM authentication 
        NULL,                        // Authentication services 
        NULL,                        // Reserved 
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication  
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation   
        NULL,                        // Authentication info 
        EOAC_NONE,                   // Additional capabilities  
        NULL                         // Reserved 
        );
    if (FAILED(hres)) 
    { 
        cout << "Failed to initialize security. Error code = 0x"  
            << hex << hres << endl; 
        CoUninitialize(); 
        return 1;                    // Program has failed. 
    }      
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    IWbemLocator *pLoc = NULL;
    hres = CoCreateInstance( 
        CLSID_WbemLocator,              
        0, 
        CLSCTX_INPROC_SERVER,  
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres)) 
    { 
        cout << "Failed to create IWbemLocator object." 
            << " Err code = 0x" 
            << hex << hres << endl; 
        CoUninitialize(); 
        return 1;                 // Program has failed. 
    }
    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method 
    IWbemServices *pSvc = NULL; 
    // Connect to the root\cimv2 namespace with 
    // the current user and obtain pointer pSvc 
    // to make IWbemServices calls. 
    hres = pLoc->ConnectServer( 
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace 
         NULL,                    // User name. NULL = current user 
         NULL,                    // User password. NULL = current 
         0,                       // Locale. NULL indicates current 
         NULL,                    // Security flags. 
         0,                       // Authority (for example, Kerberos) 
         0,                       // Context object  
         &pSvc                    // pointer to IWbemServices proxy 
         );   
 
    if (FAILED(hres)) 
    { 
        cout << "Could not connect. Error code = 0x"  
             << hex << hres << endl; 
        pLoc->Release();      
        CoUninitialize(); 
        return 1;                // Program has failed. 
    }
    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
    // Step 5: -------------------------------------------------- 
    // Set security levels on the proxy -------------------------
    hres = CoSetProxyBlanket( 
       pSvc,                        // Indicates the proxy to set 
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
       NULL,                        // Server principal name  
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx  
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx 
       NULL,                        // client identity 
       EOAC_NONE                    // proxy capabilities  
    );
 
    if (FAILED(hres)) 
    { 
        cout << "Could not set proxy blanket. Error code = 0x"  
            << hex << hres << endl; 
        pSvc->Release(); 
        pLoc->Release();      
        CoUninitialize(); 
        return 1;               // Program has failed. 
    }
  // Step 6: -------------------------------------------------- 
    // Use the IWbemServices pointer to make requests of WMI ----
  // For example, get the name of the operating system 
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery( 
        bstr_t("WQL"),  
        bstr_t("SELECT * FROM Win32_BaseBoard"), 
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,  
        NULL, 
        &pEnumerator); 
    
    if (FAILED(hres)) 
    { 
        cout << "Query for operating system name failed." 
            << " Error code = 0x"  
            << hex << hres << endl; 
        pSvc->Release(); 
        pLoc->Release(); 
        CoUninitialize(); 
        return 1;               // Program has failed.
    }
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0; 
    while (pEnumerator) 
    { 
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,  
            &pclsObj, &uReturn); 
        if(0 == uReturn) 
        { 
            break; 
        } 
        VARIANT vtProp;
        // Get the value of the Name property 
        hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);  //BSTR vtProp
    _bstr_t BaseBoard(vtProp.bstrVal);
    _bstr_t ID = "BaseBoard=" + BaseBoard; 
    [b]//преобразуем _bstr_t ID в массив char и записываем его по переданному в параметре адресу[/b]
    strcpy_s(pMemory, ID.length() + 1, (LPCSTR)ID);
 
        VariantClear(&vtProp); 
        pclsObj->Release(); 
    }
    // Cleanup 
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
    
    return 0;
}
Ответ:
Arbit
4. если возвращаю _bstr_t res.Detach()

_bstr_t ID = L"BaseBoard=" + res.Detach();


возврат - это
return  res.Detach();
Вопрос: модуль php для apache не может отправить почту

Есть система lfs версии 7.0
В ней из исходников собран apache версии 2.4.18 и php версии 5.5.13
Мне нужен был только модуль для apache и не нужен был php интерпретатор, но собрать без интерпретатора так и не получилось (в моём вопросе отправки почты - интерпретатор, помог выяснить некоторый вопрос), собирал несколько раз, то собрал без графической библиотеки и капча не работала, то ещё без каких то библиотек. На сборку потратил кучу времени, но в конце концов собрал и всё заработало.
Собирал apache вот с такими опциями:
Код
./configure --enable-authnz-fcgi \
--enable-layout=LFS \
--enable-mods-shared="all cgi" \
--enable-mpms-shared=all \
--with-apr=/usr/bin/apr-1-config \
--with-apr-util=/usr/bin/apu-1-config \
--enable-suexec=shared \
--with-suexec-bin=/usr/lib/httpd/suexec \
--with-suexec-docroot=/srv/apache \
--with-suexec-caller=apache \
--with-suexec-userdir=public_html \
--with-suexec-logfile=/var/log/httpd/suexec.log \
--with-suexec-uidmin=100
php собирал вот с такими опциями:
Код
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--with-apxs2=/usr/bin/apxs \
--datadir=/usr/share/php \
--mandir=/usr/share/man \
--disable-ipv6 \
--enable-dba \
--enable-dba=shared \
--with-gdbm \
--enable-maintainer-zts \
--enable-fpm \
--with-fpm-user=apache \
--with-fpm-group=apache \
--with-config-file-path=/etc \
--with-pcre-regex=/usr \
--with-zlib \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--with-curl \
--enable-exif \
--enable-ftp \
--with-kerberos \
--with-t1lib \
--with-gettext \
--with-gmp \
 --with-ldap-sasl \
 --without-pdo-sqlite \
--with-pspell \
--with-readline \
--with-snmp \
--with-iconv \
--with-openssl \
--with-openssl-dir=/usr \
--with-gd=/usr \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-zlib-dir=/usr \
--with-freetype-dir=/usr \
--with-mysql \
--with-mysql-sock=/var/run/mysql \
--enable-sockets \
--with-mysql=mysqlnd \
--with-mysqli \
--with-mysqli=mysqlnd \
--with-pdo-mysql \
--with-pdo-mysql=mysqlnd \
  --enable-mbstring
До сборки apache и php пришлось собрать вот такие пакеты программ:
valgrind-3.9.0.tar.bz2
apr-1.5.0.tar.bz2
apr-util-1.5.3.tar.bz2
xproto-7.0.26.tar.gz
xextproto-7.3.0.tar.gz
xtrans-1.3.4.tar.gz
xcb-proto-1.10.tar.bz2
util-macros-1.19.0.tar.bz2
dmxproto-2.3.1.tar.bz2
inputproto-2.3-1.tar.bz2
kbproto-1.0.6-1.tar.bz2
libXau-1.0.8.tar.bz2
libpthread-stubs-0.1.tar.bz2
libxcb-1.10.tar.bz2
xf86bigfontproto-1.2.0.tar.bz2
xf86dgaproto-2.1.tar.bz2
xf86driproto-2.1.1.tar.bz2
xf86miscproto-0.9.3.tar.bz2
xf86rushproto-1.1.2.tar.bz2
xf86vidmodeproto-2.3.1.tar.bz2
xineramaproto-1.2.1.tar.bz2
libX11-1.6.2.tar.gz
libXpm-3.5.11.tar.bz2
yasm-1.2.0.tar.gz
libvpx-v1.3.0.tar
libgd-2.1.0.tar
t1lib-5.1.2.tar.gz
Без этих пакетов ни apache ни php не собирался.
После установки всего этого, поверил работу apache и php взял работающий сайт написанный на cms с базой данный - mysql. Всё работало отлично, работало с базой данный записывались, выбирались из базы и т. д. Работала капча.


Вот файл из которого пытаюсь отправить почту:
Код
<?php
set_error_handler('err_handler');
function err_handler($errno, $errmsg, $filename, $linenum)
{
$date = date('Y-m-d H:i:s (T)');
$f = fopen('errors.txt', 'a');
if (!empty($f))
{
$filename =str_replace($_SERVER['DOCUMENT_ROOT'],'',$filename);
$err = "$errmsg = $filename = $linenum\r\n";
fwrite($f, $err);
fclose($f);
}
}
error_reporting(E_ALL);
ini_set('log_errors', 'On');
ini_set('error_log', '/var/log/httpd/php_errors.log');
ini_set("display_errors", "1");
try
{
if (mail("xxxxx@xxxx.xx", "test111", "test222"))
{
echo "Почта работает.";
}
else
{
echo "Почта не работает.";
}
}
catch (Exception $exc)
{
error_log($exc->getMessage());
}
?>
Для отправки почты использую ssmtp, в конфигах ssmtp всё прописано для отправки почты, почта отправляется из командной строки, из командной строки ssmtp работает отлично.

В php.ini включил следующие опции:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
log_errors = On
error_log = /var/log/httpd/php_errors.log
mail.log = /var/log/httpd/php_mail.log
SMTP = localhost
smtp_port = 465
sendmail_path = /usr/local/sbin/ssmtp -t

При запуске apache в файле error.log пишется вот что:
Код
[Sun Nov 20 18:37:45.524273 2016] [mpm_event:notice] [pid 23986:tid 3074820368] AH00491: caught SIGTERM, shutting down
No log handling enabled - using stderr logging
MIB search path: $HOME/.snmp/mibs:/usr/local/share/snmp/mibs
Cannot find module (SNMPv2-MIB): At line 0 in (none)
Cannot find module (IF-MIB): At line 0 in (none)
Cannot find module (IP-MIB): At line 0 in (none)
Cannot find module (TCP-MIB): At line 0 in (none)
Cannot find module (UDP-MIB): At line 0 in (none)
Cannot find module (HOST-RESOURCES-MIB): At line 0 in (none)
Cannot find module (NOTIFICATION-LOG-MIB): At line 0 in (none)
Cannot find module (DISMAN-EVENT-MIB): At line 0 in (none)
Cannot find module (DISMAN-SCHEDULE-MIB): At line 0 in (none)
Cannot find module (UCD-SNMP-MIB): At line 0 in (none)
Cannot find module (UCD-DEMO-MIB): At line 0 in (none)
Cannot find module (SNMP-TARGET-MIB): At line 0 in (none)
Cannot find module (NET-SNMP-AGENT-MIB): At line 0 in (none)
Cannot find module (HOST-RESOURCES-TYPES): At line 0 in (none)
Cannot find module (SNMP-MPD-MIB): At line 0 in (none)
Cannot find module (SNMP-USER-BASED-SM-MIB): At line 0 in (none)
Cannot find module (SNMP-FRAMEWORK-MIB): At line 0 in (none)
Cannot find module (SNMP-VIEW-BASED-ACM-MIB): At line 0 in (none)
Cannot find module (SNMP-COMMUNITY-MIB): At line 0 in (none)
Cannot find module (IP-FORWARD-MIB): At line 0 in (none)
Cannot find module (NET-SNMP-PASS-MIB): At line 0 in (none)
Cannot find module (NET-SNMP-EXTEND-MIB): At line 0 in (none)
Cannot find module (UCD-DLMOD-MIB): At line 0 in (none)
Cannot find module (SNMP-NOTIFICATION-MIB): At line 0 in (none)
Cannot find module (SNMPv2-TM): At line 0 in (none)
Cannot find module (NET-SNMP-VACM-MIB): At line 0 in (none)
[Sun Nov 20 18:37:48.829030 2016] [mpm_event:notice] [pid 25990:tid 3075352848] AH00489: Apache/2.4.18 (Unix) PHP/5.5.13 configured -- resuming normal operations
[Sun Nov 20 18:37:48.829191 2016] [core:notice] [pid 25990:tid 3075352848] AH00094: Command line: '/usr/sbin/httpd'
Когда в браузере открываю этот сайт то почта не отправляется.
Срабатывает коммутатор if и выводится:
"Почта не работает."
В логаг тишина.
В access.log для этого сайта.
xx.xx.xx.xx - - [20/Nov/2016:18:42:04 +0200] "GET / HTTP/1.1" 200 33 "-" "Opera/x.xx (X11; Linux i686) Presto/x.xx.xxx Version/xx.xx"
В error.log для этого сайта ничего нет.
В access.log общий для apache ничего нет.
В error.log общий для apache новых записей нет, кроме старых приведённых выше после запуска apache.
В fpm-php.log ничего нет.
В php_errors.log ничего нет.
В php_mail.log
[20-Nov-2016 18:43:58 Europe/Kiev] mail() on [/xxxx/xxx/xxxxxx/xxx/xxxx.xx/index.php:21]: To: -- Headers:.

Если php файл, в котором я пытаюсь отправить почту, передать php интерпретатору php -f < index.php то почта отправляется!!!!

Получается php модуль для apache почту не может отправить, а php интерпретатор почту отправляет.

Подскажите хоть в каком направлении смотреть, или как ещё можно включить логи, что бы хоть что нибудь написало....

За помощь заранее благодарен!

PS. Что бы не раскрывать некоторые данные, я их заменил иксами.
Ответ: Глянув в системные логи mail.log и sys.log (как включить логирование в самом ssmtp я так и не нашёл) увидел что ssmtp при запуске интерпретатора php запускается от рута и в логах пишется что пользователь root.
А когда я письмо отправляю через сайт то ssmtp запускается от пользователя apache. В общем надо было подправить конфиги ssmtp.
В файле /usr/local/etc/ssmtp/revaliases
вместо строки:
root:xxxxxx@ukr.net:smtp.ukr.net:465
вписать или дописать строку:
apache:xxxxxx@ukr.net:smtp.ukr.net:465
А в файле:
/usr/local/etc/ssmtp/ssmtp.conf
строку:
root=xxxxxx@ukr.net # от чьего имени шлем письма
можно оставить, можно удалить, а можно поменять на:
apache=xxxxxx@ukr.net # от чьего имени шлем письма

и тогда всё заработает.

И ещё. У меня apache работает в chroot. В этом же chroot находится и ssmtp.
Так вот для работы ssmtp нужен ещё и bash, но обязательно что бы он назывался не bash, а sh. Нужно переименовать bash в sh или создать ссылку sh на bash. Конфиги пользователей .bashrc .profile и т. д. как и сами домашние директории пользователей от которых запускается ssmtp, а так же домашняя директория root и файлы /etc/bashrc /etc/profile не нужны.
Необходимо только наличие всех необходимых библиотек для баша libhistory.so и т.д. Также нужны файлы /etc/passwd /etc/group /etc/shadow с пользователем от которого запускается apache, в моём случае это пользователь apache. Так же ещё нужны все необходимые библиотеки для apache, php и ещё некоторые файлы.

Всё вопрос решённый тему можно закрывать.

Добавлено через 2 минуты
кнопку о том что вопрос решён так и не нашёл.
Вопрос: c++ и wmi удаленный запуск клиентов

при удаленном запуске win32_process=server.exe с использованием утилиты wmi вылетает ошибка
 "Первый этап обработки исключения по адресу 0x7559C41F (KernelBase.dll) в WMI_TEST.exe: 0x80070721: Ошибка в пакете безопасности."
подключение к удаленному компу происходит, домена нет, pClass указывает на NULL , значит не найден класс win32_process?

Код

#include "stdafx.h"
#include <comdef.h>
#include <iostream>
#pragma comment (lib, "E:/work/zarnitsa/Railway/common-unmanaged/inc/cpp/native/ntos/thread/WbemUuid.lib")
#pragma comment (lib, "E:/work/zarnitsa/Railway/common-unmanaged/inc/cpp/native/ntos/thread/credui.lib")
#include "WbemIdl.h"
#include <strsafe.h>
#include <wincred.h>

                HRESULT hr;
        hr=CoInitializeEx(0, COINIT_APARTMENTTHREADED/* COINIT_MULTITHREADED*/); 
         if (FAILED(hr)) 
         { 
        std::cout << "Failed to initialize COM library. Error code = 0x"<<std::hex << hr<<std::endl; 
            return hr;
        }

                 hr =  CoInitializeSecurity(               
         NULL,                      // Security descriptor    
         -1,                        // COM negotiates authentication service
        NULL,                      // Authentication services
         NULL,                      // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level for proxies
         RPC_C_IMP_LEVEL_DELEGATE/*RPC_C_IMP_LEVEL_IMPERSONATE*/, // Default Impersonation level for proxies
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities of the client or server
        NULL);                       // Reserved

         if (FAILED(hr))
        {
            std::cout << "Failed to initialize security. Error code = 0x" << std::hex << hr << std::endl;
            CoUninitialize();
            system("pause");
            return hr;                  // Program has failed.
        }
                IWbemLocator *pLoc = nullptr;                

        hr = CoCreateInstance(
         CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);

        if (FAILED(hr))
        {
        std::cout << "Failed to create IWbemLocator object. Err code = 0x"<<std::hex << hr<<std::endl ;
        CoUninitialize();
        system("pause");
        return hr;     // Program has failed.
        }
        ///////////////////////////////////////////////////////////
        IWbemServices *pSvc = NULL;

        // Get the user name and password for the remote computer



        CREDUI_INFO cui;
        bool useToken = false;
        bool useNTLM = true;
        wchar_t pszName1[CREDUI_MAX_USERNAME_LENGTH+1] = {0};
        wchar_t pszPwd2[CREDUI_MAX_PASSWORD_LENGTH+1] = {0};
        wchar_t pszDomain2[CREDUI_MAX_USERNAME_LENGTH+1];
        wchar_t pszUserName[CREDUI_MAX_USERNAME_LENGTH+1];
        wchar_t pszAuthority[CREDUI_MAX_USERNAME_LENGTH+1];
        BOOL fSave;
        DWORD dwErr;
               memset(&cui,0,sizeof(CREDUI_INFO));
        cui.cbSize = sizeof(CREDUI_INFO);
        cui.hwndParent = NULL;
                cui.pszMessageText = TEXT("Press cancel to use process token");
        cui.pszCaptionText = TEXT("Enter Account Information");
        cui.hbmBanner = NULL;
        fSave = FALSE;
        SecureZeroMemory(pszName1, sizeof(pszName1));
        SecureZeroMemory(pszPwd2, sizeof(pszPwd2));

        dwErr = CredUIPromptForCredentials( 
        &cui,                             // CREDUI_INFO structure
        TEXT(""),                         // Target for credentials
        NULL,                             // Reserved
        0,                                // Reason
        pszName1,                          // User name
        CREDUI_MAX_USERNAME_LENGTH+1,     // Max number for user name
         pszPwd2,                           // Password
        CREDUI_MAX_PASSWORD_LENGTH+1,     // Max number for password
        &fSave,                           // State of save check box
                CREDUI_FLAGS_GENERIC_CREDENTIALS |// flags
            CREDUI_FLAGS_ALWAYS_SHOW_UI |
        CREDUI_FLAGS_DO_NOT_PERSIST);  

        if(dwErr == ERROR_CANCELLED)
        {
        useToken = true;
        }
        else if (dwErr)
        {
        std::cout << "Did not get credentials " << dwErr <<std::endl;
        system("pause");
        pLoc->Release();     
        CoUninitialize();
        return 1;      
        }

        // change the computerName strings below to the full computer name
        // of the remote computer
        if(!useNTLM)
         {
        StringCchPrintf(pszAuthority, CREDUI_MAX_USERNAME_LENGTH+1, L"kERBEROS:%s", L"TEST4PC");
        }

              hr = pLoc->ConnectServer(
            _bstr_t(L"\\\\TEST4PC\\root\\cimv2"),
             bstr_t(useToken ? NULL : pszName1),    // User name
             _bstr_t(useToken ? NULL : pszPwd2),     // User password
            NULL,                              // Locale             
             NULL,                              // Security flags
            _bstr_t(useNTLM ? NULL : pszAuthority),// Authority        
             NULL,                              // Context object 
            &pSvc                              // IWbemServices proxy    



            );
         if (FAILED(hr))
        {
        std::cout << "Could not connect. Error code = 0x" 
        << std::hex << hr << std::endl;
        system("pause");
        pLoc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
        }

        std::cout << "Connected to ROOT\\CIMV2 WMI namespace" << std::endl;
        COAUTHIDENTITY *userAcct =  NULL ;
         hr = CoSetProxyBlanket(
        pSvc,                           // Indicates the proxy to set
         RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
        COLE_DEFAULT_PRINCIPAL,         // Server principal name 
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_DELEGATE/*RPC_C_IMP_LEVEL_IMPERSONATE*/,    // RPC_C_IMP_LEVEL_xxx
        userAcct,                       // client identity
        EOAC_NONE                       // proxy capabilities 
        );

        if (FAILED(hr))
        {
        std::cout << "Could not set proxy blanket. Error code = 0x" 
        << std::hex << hr << std::endl;
        system("pause");
        pSvc->Release();
        pLoc->Release();     
         CoUninitialize();
        return 1;               // Program has failed.
        }

               IWbemClassObject* pClass ;
        bstr_t path_my = SysAllocString(L"\\\\TEST4PC\ROOT\CIMV2:Win32_Process");
        BSTR MethodName = SysAllocString(L"Create");
        hr = pSvc->GetObjectW( //здесь ошибка
        path_my,            // [IN] Path of the object to retrieve.
        0,                        // [IN] The following flags affect the behavior of this method. 
        NULL,                    // [IN] Otherwise, this is a pointer to an IWbemContext object that may be used by the provider that is producing the requested class or instance.Otherwise, this is a pointer to an    IWbemContext object that may be used by the provider that is producing the requested class or instance.
        &pClass,                // [OUT] The returned object has a positive reference count.
        NULL                    // [OUT] The ppCallResult parameter receives a pointer to a new IWbemCallResult object, which can then be polled to obtain the result using the GetCallStatus method.
        );
         if (pClass == NULL) 
        {   
        //не нашли класс L"Win32_Process"    
        //system("pause");
        return hr;
        }
        IWbemClassObject* pInParamsDefinition = NULL;
        hr = pClass->GetMethod(MethodName, 0, 
        &pInParamsDefinition, NULL);
        IWbemClassObject* pClassInstance = NULL;
        hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
        // значения входных параметров
        VARIANT varCommand;
        varCommand.vt = VT_BSTR;
        varCommand.bstrVal = L"server.exe";
         // Store the value for the in parameters
        hr = pClassInstance->Put(L"CommandLine", 0,
        &varCommand, 0);
IWbemClassObject* pOutParams = NULL;
        IWbemCallResult* pRes = 0;
        hr = pSvc->ExecMethod(path_my, MethodName, 0, NULL, pClassInstance, &pOutParams, &pRes);
        
        if (FAILED(hr))
        {
        std::cout << "Could not execute method. Error code = 0x"<< std::hex << hr << std::endl;
            system("pause");
        VariantClear(&varCommand);
        SysFreeString(path_my);
        SysFreeString(MethodName);
        pClass->Release();
        pInParamsDefinition->Release();
        pOutParams->Release();
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }


Ответ:
узнал что надо сделать Win32_ScheduledJob вместо Win32_Process, но с параметрами при выполнении ExecMethod что-то не то, пишет что "один или несколько параметров неверны"
Код

HRESULT hres;
...
 
BSTR MethodName = SysAllocString(L"Create")
BSTR ClassName3 = SysAllocString(L"Win32_ScheduledJob");
IWbemClassObject* pClass = NULL;
hres = pSvc->GetObject(ClassName3, 0, NULL, &pClass, NULL);
IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod(MethodName, 0,&pInParamsDefinition, NULL);
 
IWbemClassObject* pClassInstance = NULL;
hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
 
VARIANT vtProp2;
                vtProp2.vt = VT_BSTR;
                vtProp2.bstrVal =L"calc.exe";
 
                VARIANT vtProp3;
                vtProp3.vt = VT_BSTR;
                vtProp3.bstrVal =  L"********012500.000000 - 420";//заменить на текущее
 
 
                VARIANT vtProp4;
                vtProp4.vt = VT_BOOL;
                vtProp4.boolVal = true;//запускать сразу
 
                VARIANT vtProp5;
                vtProp5.vt = VT_INT;
                vtProp5.intVal=2;//день в неделе
 
                VARIANT vtProp6;
                vtProp6.vt = VT_INT;
                vtProp6.intVal = NULL;//день в году
 
                VARIANT vtProp7;
                vtProp7.vt = VT_BOOL;
                vtProp7.boolVal = true;//отобр на столе
 
                UINT32 jobId;
 
hres = pClassInstance->Put(L"Command", 0, &vtProp2, 0);
hres = pClassInstance->Put(L"StartTime", 0, &vtProp3, 0);
hres = pClassInstance->Put(L"RunRepeatedly", 0, &vtProp4, 0);
hres = pClassInstance->Put(L"DaysOfWeek", 0, &vtProp5, 0);
hres = pClassInstance->Put(L"DaysOfMounth", 0, &vtProp6, 0);
hres = pClassInstance->Put(L"InteractWithDesktop", 0, &vtProp7, 0);
IWbemClassObject* pOutParams = NULL;
 
                    hres = pSvc->ExecMethod(ClassName3, MethodName, 0,
                
                     NULL, pClassInstance, &pOutParams, NULL);
    if (FAILED(hres))
 
            {
 
                cout << "Could not execute method. Error code = 0x"
 
                    << hex << hres << endl;
 
                     VariantClear(&varCommand);
 
                        SysFreeString(ClassName);
 
               SysFreeString(MethodName);
 
                pClass->Release();
 
                pInParamsDefinition->Release();
 
                pOutParams->Release();
 
                pSvc->Release();
 
                pLoc->Release();
                
                CoUninitialize();
 
                return 1;               // Program has failed.
 
            }

Вопрос: Получение Pid процесса

Программа определяет размер и заполненность жесткого диска, название звуковой карты и выводит список и количество запущенных процессов. Хочу добавить выведение pid процесса рядом с названием. Подскажите пожалуйста как это можно осуществить ?
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
# include <Windows.h>
# include <conio.h>
# include <locale>
#pragma comment(lib, "wbemuuid.lib")
 
 
int main(int argc, char **argv)
{
int a = 0;
 
cout<<" Information about hard disk drive :  "<<endl;
 
 
 
 
      setlocale(LC_ALL, "rus");
    int sz = GetLogicalDriveStrings(NULL, 0);
    TCHAR* szLogicalDrives = new TCHAR [sz];
    GetLogicalDriveStrings(sz, szLogicalDrives);
 
    while(*szLogicalDrives)
    {
        TCHAR szDisk[80];
        lstrcpy(szDisk, szLogicalDrives);
        GetDriveType(szDisk);
        UINT uDriveType = GetDriveType(szDisk);
        if(uDriveType == DRIVE_FIXED)
        {
            std::wcout << szDisk << std::endl;
            //определяем объем      
            __int64 uliTotalBytes;
            __int64 FreeBytesAvailable;
            GetDiskFreeSpaceEx(szDisk,(PULARGE_INTEGER)&FreeBytesAvailable,(PULARGE_INTEGER)&uliTotalBytes,NULL);
            std::wcout << L"Объем диска:\t" << uliTotalBytes/(1024*1024)  << L" МБ\n";
            std::wcout << L"Объем свободного места на диске:\t" << FreeBytesAvailable/(1024*1024)  << L" МБ\n";
            std::wcout << std::endl;
        }       
        while(*szLogicalDrives) szLogicalDrives++;
        szLogicalDrives++;
    }
 
////////////////////////
    cout<<" Information about sound device :  "<<endl;
cout<<" "<<endl;
    HRESULT hres;
 
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
 
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" 
            << hex << hres << endl;
        return 1;                  // Program has failed.
    }
 
    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
 
    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );
 
                      
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x" 
            << hex << hres << endl;
        CoUninitialize();
        return 1;                    // Program has failed.
    }
    
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
 
    IWbemLocator *pLoc = NULL;
 
    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object."
            << " Err code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }
 
    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method
 
    IWbemServices *pSvc = NULL;
 
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (for example, Kerberos)
         0,                       // Context object 
         &pSvc                    // pointer to IWbemServices proxy
         );
    
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x" 
             << hex << hres << endl;
        pLoc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }
 
    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
 
 
    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------
 
    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities 
    );
 
    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x" 
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }
 
    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
 
    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT * FROM Win32_SoundDevice"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed."
            << " Error code = 0x" 
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return 1;               // Program has failed.
    }
 
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
 
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
   
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);
 
        if(0 == uReturn)
        {
            break;
        }
 
        VARIANT vtProp;
 
        hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
        wcout << L" Name : " << vtProp.bstrVal << endl;
        hr = pclsObj->Get(L"Status", 0, &vtProp, 0, 0);
        wcout << L" Status : " << vtProp.bstrVal << endl;
        hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
        wcout << L" DeviceID : " << vtProp.bstrVal << endl;
        VariantClear(&vtProp);
 
        pclsObj->Release();
    }
     ///////////
    cout<<"  "<<endl;
    cout<<" Information about running proces :  "<<endl;
    cout<<"  "<<endl;
 
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT * FROM Win32_Process"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
        cout << "Query for processes failed. "
             << "Error code = 0x" 
             << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }
    else
    { 
        IWbemClassObject *pclsObj;
        ULONG uReturn = 0;
   
        while (pEnumerator)
        {
            
            hres = pEnumerator->Next(WBEM_INFINITE, 1, 
                &pclsObj, &uReturn);
 
            if(0 == uReturn)
            {
                break;
            }
 
            VARIANT vtProp;
 
            // Get the value of the Name property
            hres = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
            wcout << "Process Name : " << vtProp.bstrVal << endl;
            VariantClear(&vtProp);
            a++; ////////// счетчик
        }
    }
 
    cout<<"Количество запущенных процессов  "<<a<<endl;
 
 
    // Cleanup
    // ========
    
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
 
    system("pause");
    return 0;   // Program successfully completed.
 
}
Ответ: Ну и вариант с Toolhelp API на всякий случай:
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
#include <Windows.h>
#include <TlHelp32.h>
#include <cstdio>
 
int main()
{
    HANDLE const hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    if (INVALID_HANDLE_VALUE == hSnap)
    {
        printf("CreateToolhelp32Snapshot failed, err = 0x%.8lx.\r\n", GetLastError());
        return EXIT_FAILURE;
    }
 
    PROCESSENTRY32W Entry = {0};
    Entry.dwSize = sizeof (Entry);
 
    if (Process32FirstW(hSnap, &Entry))
    {
        do
        {
            wprintf(L"Process PID = %lu, Name = %s\r\n", Entry.th32ProcessID, &Entry.szExeFile[0]);
        } while (Process32NextW(hSnap, &Entry));
    }
 
    CloseHandle(hSnap);
    return EXIT_SUCCESS;
}