Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение строковых переменных. / 18 сообщений из 18, страница 1 из 1
07.09.2015, 09:47
    #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
07.09.2015, 09:50
    #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
07.09.2015, 09:55
    #39044622
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строковых переменных.
SashaMercury,

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

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

Покажите весь цикл, пожалуйста.
...
Рейтинг: 0 / 0
07.09.2015, 10:04
    #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
07.09.2015, 10:06
    #39044637
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строковых переменных.
Dima TПосмотри что в process.name, там возможно имя с путем.
strcmp регистрозависимая, т.е.
Код: plaintext
1.
strcmp("Mored.exe", "mored.exe") != 0



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

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



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

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

Я чет смотрю в окно вывода выводит слишком много информации.
Это не критично?
...
Рейтинг: 0 / 0
09.09.2015, 16:43
    #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
09.09.2015, 16:46
    #39047208
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строковых переменных.
Лучше наверно сделать
Код: plaintext
1.
if (position <= 50)


Подстраховаться от предшествующих пробелов.
...
Рейтинг: 0 / 0
09.09.2015, 16:51
    #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
09.09.2015, 16:56
    #39047232
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение строковых переменных.
Dima T,

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


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