powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение строковых переменных.
18 сообщений из 18, страница 1 из 1
Сравнение строковых переменных.
    #39044610
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Подскажите плиз, правильно ли я реализовал проверку существования вот этого процесса на удаленной машине?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		if (strcmp(process.name, "mored.exe") == 0) {
			cout << "ECT MORED" << endl;
			mss.str(std::string());
			mss.clear();
			ms.clear();
			return 1;
		}



Начал замечать, что иногда он не заходит в if, хотя точно знаю, что этот процесс запущен на удаленной машине.
Почему такое может быть?
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044612
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokДобрый день, коллеги!
Подскажите плиз, правильно ли я реализовал проверку существования вот этого процесса на удаленной машине?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		if (strcmp(process.name, "mored.exe") == 0) {
			cout << "ECT MORED" << endl;
			mss.str(std::string());
			mss.clear();
			ms.clear();
			return 1;
		}



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

Вы реализовали не проверку существования процесса, а проверку того? что у процесса имя "mored.exe"
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044622
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Ну там цикл, который пробегает по всем процессам.
Поэтому это проверка существования.
По край не мере я так думаю.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044631
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри что в process.name, там возможно имя с путем.
strcmp регистрозависимая, т.е.
Код: plaintext
1.
strcmp("Mored.exe", "mored.exe") != 0
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044632
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokSashaMercury,

Ну там цикл, который пробегает по всем процессам.
Поэтому это проверка существования.
По край не мере я так думаю.

Покажите весь цикл, пожалуйста.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044634
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryvadipokSashaMercury,

Ну там цикл, который пробегает по всем процессам.
Поэтому это проверка существования.
По край не мере я так думаю.

Покажите весь цикл, пожалуйста.

Код: plaintext
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.
	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;
		return 1;                 // Program has failed.
	}

	// Connect to the remote root\cimv2 namespace
	// and obtain pointer pSvc to make IWbemServices calls.
	char computerName[50];
	char* var1 = "\\\\";
	char* var2 = "\\root\\cimv2";
	sprintf(computerName, "%s%s%s", var1, arg.ip, var2);

	hres = pLoc->ConnectServer(
		_bstr_t(computerName),
		NULL,                              // User name
		NULL,                              // User password
		NULL,                              // Locale             
		NULL,                              // Security flags
		NULL,                              // Authority
		NULL,                              // Context object 
		&pSvc                              // IWbemServices proxy
		);
	if (FAILED(hres))
	{
		return 1;                // Program has failed.
	}

	// Step 6: Set security levels on a WMI connection -------------------------
	hres = 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_IMPERSONATE,    // RPC_C_IMP_LEVEL_xxx
	   NULL,                           // client identity
	   EOAC_NONE                       // proxy capabilities 
	);
	if (FAILED(hres))
	{
		return 1;               // Program has failed.
	}

	// Запрос данных

	VARIANT vtProp;
	VARIANT vtProp2;

	IEnumWbemClassObject* pEnumerator = NULL;
	IWbemClassObject *pclsObj = NULL;
	ULONG uReturn = 0;

	//++++++++++++ПРОЦЕССЫ+++++++++++++++++
	int step_proc = 0;
	PROCESS process; 
	process.employeeID = arg.employeeID;

	// Step 7: Use the IWbemServices pointer to make requests of WMI ----
	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 operating system name failed." << " Error code = 0x" << hex << hres << endl;
		pSvc->Release();
		pLoc->Release();  
		return 1;               // Program has failed.
	}

	// Step 8: -------------------------------------------------
	// Secure the enumerator proxy
	hres = CoSetProxyBlanket(
		pEnumerator,                    // 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_IMPERSONATE,    // RPC_C_IMP_LEVEL_xxx
		NULL,                           // client identity
		EOAC_NONE                       // proxy capabilities 
		);
	if (FAILED(hres))
	{
		cout << "Could not set proxy blanket on enumerator. Error code = 0x" << hex << hres << endl;
		pSvc->Release();
		pLoc->Release();
		pclsObj = NULL;
		return 1;               // Program has failed.
	}

	// Step 9: Get the data from the query in step 7 -------------------
	uReturn = 0;
	while (pEnumerator)
	{
		HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

		if ( FAILED( hr ) )
		{
			return 1;
		}
		if(0 == uReturn)
		{
			break;
		}

		VARIANT vtProp1;

		hr = pclsObj->Get(L"Name", 0, &vtProp1, 0, 0);
		process.name = _com_util::ConvertBSTRToString(vtProp1.bstrVal);
		VariantClear(&vtProp1);

		if (strcmp(process.name, "mored.exe") == 0) {
			cout << "ECT MORED" << endl;
			pSvc->Release();
			pLoc->Release();  
			pEnumerator->Release();
			if( pclsObj )
			{
				pclsObj->Release();
			}
			mss.str(std::string());
			mss.clear();
			ms.clear();
			return 1;
		}

		// Запись результата в очередь
		WaitForSingleObject(result_change, INFINITE);
		result2.push(process);
		SetEvent(result_change);

		pclsObj->Release();
		pclsObj = NULL;
	}
	pEnumerator->Release();
	if( pclsObj )
	{
		pclsObj->Release();
	}




Ошибку вроде нашел.
Скорее всего не до конца не очищаю память.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
		if (strcmp(process.name, "mored.exe") == 0) {
			cout << "ECT MORED" << endl;
			pSvc->Release();
			pLoc->Release();  
			pEnumerator->Release();
			if( pclsObj )
			{
				pclsObj->Release();
			}
			mss.str(std::string());
			mss.clear();
			ms.clear();
			return 1;
		}
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044637
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПосмотри что в process.name, там возможно имя с путем.
strcmp регистрозависимая, т.е.
Код: plaintext
1.
strcmp("Mored.exe", "mored.exe") != 0



Это вряд ли, до этого приложение уже работало по запущенным программам.
Мы обработали все процессы запускаемые в конторе, такого не разу не видел.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044645
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После прохождения проверки, если он успешен, дальше идет запуск программы.
Код: plaintext
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.
	IWbemLocator *pLoc2 = NULL;
	IWbemServices *pSvc2 = NULL;

	// Step 3: Obtain the initial locator to WMI -------------------------
	hres2 = CoCreateInstance(
		CLSID_WbemLocator,             
		0, 
		CLSCTX_INPROC_SERVER, 
		IID_IWbemLocator, (LPVOID *) &pLoc2);
	if (FAILED(hres2))
	{
		cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres2 << endl;
		return 1;                 // Program has failed.
	}

	// Connect to the remote root\cimv2 namespace
	// and obtain pointer pSvc to make IWbemServices calls.
	char computerName2[50];
	char* var4 = "\\\\";
	char* var5 = "\\root\\cimv2";
	char* var6 = "XX.X.X.XXX";
	sprintf(computerName2, "%s%s%s", var4, var6, var5);

	hres2 = pLoc2->ConnectServer(
		_bstr_t(computerName2),
		NULL,                              // User name
		NULL,                              // User password
		NULL,                              // Locale             
		NULL,                              // Security flags
		NULL,                              // Authority
		NULL,                              // Context object 
		&pSvc2                             // IWbemServices proxy
		);
	if (FAILED(hres2))
	{
		return 1;                // Program has failed.
	}

	// Step 6: Set security levels on a WMI connection -------------------------
	hres2 = CoSetProxyBlanket(
	   pSvc2,                           // 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_IMPERSONATE,    // RPC_C_IMP_LEVEL_xxx
	   NULL,                           // client identity
	   EOAC_NONE                       // proxy capabilities 
	);
	if (FAILED(hres2))
	{
		return 1;               // Program has failed.
	}

	BSTR MethodName = SysAllocString(L"Create");
	BSTR ClassName = SysAllocString(L"Win32_Process");
	IWbemClassObject* pClass = NULL;
	hres2 = pSvc2->GetObject(ClassName, 0, NULL, &pClass, NULL);
	IWbemClassObject* pInParamsDefinition = NULL;
	hres2 = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, NULL);
	IWbemClassObject* pClassInstance = NULL;
	hres2 = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
	VARIANT varCommand;
	varCommand.vt = VT_BSTR;
	varCommand.bstrVal = bstrVar;
	hres2 = pClassInstance->Put(L"CommandLine", 0, &varCommand, 0);
	IWbemClassObject* pOutParams = NULL;
	hres2 = pSvc2->ExecMethod(ClassName, MethodName, 0, NULL, pClassInstance, &pOutParams, NULL);
	cout << "!!!START!!!" << endl;
	if (FAILED(hres))
	{
		return 1;
	}
	//clear
	pSvc2->Release();
	pLoc2->Release();
	mss.str(std::string());
	mss.clear();
	ms.clear();

    return 0;

...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044648
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokМы обработали все процессы запускаемые в конторе, такого не разу не видел.
Запусти и посмотри
Код: plaintext
1.
2.
3.
4.
5.
	if(strcmp("Mored.exe", "mored.exe") == 0) {
		printf("==\n");
	} else {
		printf("!=\n");
	}
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044667
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Поступил проще, проверил базу по запущенным программам.
У статистика храниться с прошлого года.
Там только маленькие буквы.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044671
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одна проблема час всплыла.
Когда удаленная машина выключена или не доступна, моя программа долго пытается достучаться до него(порядка минуты), а потом дальше идет по циклу по машинам, в которых можно запустить этот процесс.
Есть какой-нибудь эффективный способ проверить доступна машина или нет?
Идея есть пингануть с дополнительным условием IF, правда не знаю достаточно ли этого и как это сделать.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044873
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПосмотри что в process.name, там возможно имя с путем.
strcmp регистрозависимая, т.е.
Код: plaintext
1.
strcmp("Mored.exe", "mored.exe") != 0



Кроме этих замечаний, всё правильно.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39044888
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

пиши логи. Пиши все process.name, которые обрабатывал и результат обработки каждого. Затем читай логи и разбирайся что не так.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39045024
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно, спасибо всем!
Вроде пашет.
Час добавил ping.

Я чет смотрю в окно вывода выводит слишком много информации.
Это не критично?
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39047200
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дубли все равно появились, поэтому проверку переделал.
На ночь оставлю работать, думаю завтра утром увижу будут дубли или нет.

Код: plaintext
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.
		char strProcName[] = "";
		char str[] = "mored";
		char *pdest;
		int position;

		Цикл по процессам 
		{
			....
			position = 0;
			sprintf(strProcName, "%s", process.name);
			pdest = strstr(strProcName, str);
			position = (int)(pdest - strProcName + 1);
			cout << position << endl;
			if (position == 1) {
				pSvc->Release();
				pLoc->Release();  
				pEnumerator->Release();
				if( pclsObj )
				{
					pclsObj->Release();
				}
				return 1;
			}
			....
		}
		
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39047208
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше наверно сделать
Код: plaintext
1.
if (position <= 50)


Подстраховаться от предшествующих пробелов.
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39047216
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
char str[] = "mored";
...
pdest = strstr(strProcName, str);


Этот код найдет "zamored.exe" и "mored35.exe", а если strProcName с путями то и "c:\umored\1.exe".
...
Рейтинг: 0 / 0
Сравнение строковых переменных.
    #39047232
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Исключено, час проверил в базе, нет таких процессов.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение строковых переменных.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]