#c #ibm-mq
#c #ibm-mq
Вопрос:
Документация IBM по ALTER CHANNEL содержит похвальное описание различных доступных изменений, но не предлагает ни одного примера — конечно, не для пользователей C .
Предположим, я хочу изменить значение MCAUSER
по умолчанию (имя пользователя ОС) на другую строку, как будет выглядеть вызов функции?
Комментарии:
1. @MoragHughson дает хороший ответ, если вы хотите установить параметр MCAUSER для канала, но, возможно, вы спрашиваете, как пройти аутентификацию от имени пользователя, отличного от имени вашего приложения, запущенного как (имя пользователя ОС)? Если это так, было бы полезно получить некоторую дополнительную информацию, такую как версия MQ, на которой запущен диспетчер очередей, и, если это версия 8.0 или более поздняя, отображение
AUTHINFO
объекта, на который указывает параметр queue manager .CONNAUTH
2. Да, это то, что я ищу. Мой клиент использует MQ SDK 7.5.0 — я не знаю, что использует сервер…
3. Возможность аутентификации зависит от версии и конфигурации диспетчера очередей.
4. Я могу подключиться с того же компьютера, что и один пользователь Unix, но не как другой. Мой собственный код не прилагает никаких усилий для ввода имени пользователя в настоящее время — клиентская библиотека должна получать его из ОС. Я уверен, что можно явно указать имя пользователя.
5. @Morag-Hughson, вы согласны с оценкой Джоша?
Ответ №1:
Документация, на которую вы ссылаетесь в своем вопросе, является ссылкой на команду MQSC. Это предназначено для сценариев.
Пожалуйста, также обратите внимание, что значение по умолчанию поля MCAUSER канала на самом деле пустое, а не имя пользователя ОС. Поскольку он пустой, то в случае канала SVRCONN, когда клиентское приложение подключается, имя пользователя операционной системы, переданное от клиента, будет использоваться для MCAUSER для этого запущенного экземпляра. Вы не можете изменить это поведение, используя ALTER CHANNEL из вашего клиентского приложения. Я отмечаю это на случай, если именно по этой причине вы думаете использовать ALTER CHANNEL.
Если вы хотите написать программу для внесения изменений в объект IBM MQ, такой как канал, вместо этого вам следует использовать другой, но эквивалентный интерфейс, называемый Programmable Command Format (PCF). Страница ссылки на эквивалентную команду находится здесь.
Здесь есть пример C PCF — ищите SrvPCF
Короче говоря, псевдокод, вы бы написали программу следующим образом:-
MQCONN(Qmgr-name)
MQOPEN(Reply-Q)
Build PCF message for MQCMD_CHANGE_CHANNEL
with MQCACH_CHANNEL_NAME
with MQIACH_CHANNEL_TYPE
with MQCACH_MCA_USER_ID
MQPUT1(PCF Message to SYSTEM.ADMIN.COMMAND.QUEUE)
MQGET(wait for reply on Reply-Q to say whether it worked or not)
Комментарии:
1. Спасибо, но, как и подозревал @JoshMC, я ищу, чтобы установить другое имя пользователя при подключении к удаленному серверу. Мой клиент, использующий MQ SDK 7.5.0, получает ошибку авторизации при подключении к тому же серверу с того же хоста, что и один пользователь, но не как другой…
2. @MikhailT. — Я тоже так подозревал, отсюда и второй абзац в моем ответе. Можете ли вы использовать runas?
3. Приветствуется. Итак, могу ли я попросить моего клиента (версия 7.5.0) предоставить серверу другое имя пользователя, или это еще одна функция, о которой никто раньше не просил? Я попытался вызвать
setUserId("desireduser")
методы как для объектов очереди, так и для объектов канала в моей программе, и, хотя оба метода возвращаютсяtrue
, я все еще получаю ошибку авторизации.4. Если вы используете функцию операционной системы runas, то вы запускаете программу так, как если бы она запускалась от имени другого пользователя.
5. Такие вещи, как
runas
иsudo
на самом деле, меняют мой эффективный UID на целевой, что не только требует локальной авторизации, Но и имеет другие неприятные последствия (предотвращает отслеживание / отладку исходным пользователем и т. Д.). Как код клиента определяет его имя пользователя? С помощьюgetuid()
илиgeteuid()
? Путем проверки переменной среды (например,$USER
)?