Re[8]: Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 23.11.10 11:19
Оценка: 6 (1) :)
Здравствуйте, Jolly Roger, Вы писали:

JR>Но если таки надумаете вернуться к вопросу, дайте знать, любопытно всё-таки


Проблема оказалась не в com'е, а в прокладке между сиденьем и клавиатурой. Когда добавлял проверку на наличие админских прав, я по глупости убрал из под пользователя не только запись в реестр, но и вызовы RegistrationServices.RegisterTypeForComClients. Естественно, что после этого программа под пользователем начала подниматься повторно.
Re[3]: Проблема с обращением через Com под пользователем
От: Jolly Roger  
Дата: 27.10.10 13:07
Оценка: 10 (1)
Здравствуйте, Undying, Вы писали:

Должен предупредить, на всякий случай, что СОМ-серверы на NET я пока не пробовал, всё руки не доходят. Зато опыт работы с СОМ довольно в нативе приличный, исходя из него и пишу.

U>Когда я указываю, что запуск нужно производить от учетной записи с админскими правами, то перестает работать даже из под этой же учетной записи. Падает с ошибкой 8000401a. Хотя, если выбирать второй вариант — запуск из под запускающего пользователя, то из под этого пользователя работает нормально.


0x8000401a

Процесс сервера не может быть запущен, так как указана неправильная идентификация. Проверьте правильность указания имени пользователя и пароля

То есть где-то Вы косячите. Проверяйте внимательно, что-то здесь не так. Со своей стороны, я не припомню подобной проблемы.

U>И в настройках безопасности самого Com-объекта и в Мой компьютер -> Безопасность Com все права вроде этому юзеру даны. Больше никаких мест для настройки нет?


Да нет, всё здесь настраивается. дефолтные перекрываются конкретными для данного сервера. Есть ещё, правда, общие разрешения на работу DCOM, задаются политикой и могут быть перекрыты доменом. Но это дела админские, я сейчас с ходу не скажу, что и как там должно быть, надо вспоминать.

U>И еще вопрос, можно ли как-то настроить все необходимые права на Сом автоматически из программы запущенной с админскими правами?


Можно, всё можно. Собственно права доступа сохраняются в AppId в виде сериализованного дескриптора безопасности. Вот здесь лежит утилита, которая может по заданному сценарию настраивать безопасность для существующего AppId. Но RunAs она не меняет, и причина в том, что для указания конкретного юзера нужен его пароль. Сохранить его не сложно, делается это с помощью LsaStorePrivateData, но вставлять его в сценарий небезопасно.
"Нормальные герои всегда идут в обход!"
Re[5]: Проблема с обращением через Com под пользователем
От: Jolly Roger  
Дата: 28.10.10 04:24
Оценка: 5 (1)
Здравствуйте, Undying, Вы писали:

А, то есть Вы её сначала вручную запускаете? Тогда конечно, COM проверит соответствие настроек безопасности текущему принципалу и вернёт ошибку. Для таких приложений надо ставить удостоверение "текущий юзер". Кроме того, внутри приложения создавать объект через COM можно, но не обязательно. Иногда предпочтительней создать объект напрямую, иногда — через COM.

U>Если же вместо запуска под конкретной учеткой стоит запуск из под текущего или запускающего пользователя, то если программа запущена из под пользователя, то поднимается второй экземпляр, что нам не нужно. При запуске программы из пользователя с правами админа все работает нормально. Т.е. непонятно, почему Com считает, что нужно поднять второй экземпляр, если уже есть поднятый Com-сервер с правами пользователя?


Это действительно странно. То есть второй экземпляр запускается под тем-же юзером? А OS у Вас какая? Можете набросать минимальный воспроизводящий ситуацию компилируемый пример?
"Нормальные герои всегда идут в обход!"
Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 27.10.10 03:42
Оценка:
Есть дотнетовская программа, в которой используются отчеты Fast Report. Отчеты получают данные из программы через Com-интерфейс. Для того, чтобы запускался только один экземпляр программы Com-сервер зареген как outproc. Под администратором все работает. Но при запуске под пользователем почему-то происходит запуск второго экземпляра программы.

После того как на своем компьютере дал пользователю в настройках Com-объекта полные права на "Разрешение на настройку" у меня проблема решилась, однако пользователь жалуется, что ему это не помогает.

Не сталкивался ли кто-нибудь с подобной проблемой? Можно ли вообще сделать, чтобы outproc Com-сервер нормально работал под пользователем с дефолтными настройками?

Создание Сом-объекта делаем так:

   t = Type.GetTypeFromProgID(progid);
   myComObj = Activator.CreateInstance(t);


Регистрацию так:

      RegistrationServices rs = new RegistrationServices();

      if (str == "register")
      {
        RegisterManagedType(typeof(ComServer));
      }

      rs.RegisterTypeForComClients(
          typeof(ComServer),
          RegistrationClassContext.RemoteServer | RegistrationClassContext.LocalServer | RegistrationClassContext.InProcessServer,
          RegistrationConnectionType.MultipleUse);
Re: Проблема с обращением через Com под пользователем
От: Jolly Roger  
Дата: 27.10.10 08:59
Оценка:
Здравствуйте, Undying, Вы писали:

U>Есть дотнетовская программа, в которой используются отчеты Fast Report. Отчеты получают данные из программы через Com-интерфейс. Для того, чтобы запускался только один экземпляр программы Com-сервер зареген как outproc. Под администратором все работает. Но при запуске под пользователем почему-то происходит запуск второго экземпляра программы.


Если в настройках безопасности сервера не указано, от кого запускать, то используется дефолтное значение "подключившийся пользователь". При этом для каждого клиента запускается отдельный экземпляр сервера. Для преодоления нужно изменить в настройках безопасности на запуск от имени либо интерактивного юзера, либо, что лучше, от имени конкретной учётной записи. Кроме того, нужно настроить разрешения на подключение. Подробнее о настройке здесь
Автор: Jolly Roger
Дата: 25.10.10
"Нормальные герои всегда идут в обход!"
Re[2]: Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 27.10.10 10:09
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Если в настройках безопасности сервера не указано, от кого запускать, то используется дефолтное значение "подключившийся пользователь". При этом для каждого клиента запускается отдельный экземпляр сервера. Для преодоления нужно изменить в настройках безопасности на запуск от имени либо интерактивного юзера, либо, что лучше, от имени конкретной учётной записи. Кроме того, нужно настроить разрешения на подключение. Подробнее о настройке здесь
Автор: Jolly Roger
Дата: 25.10.10


Когда я указываю, что запуск нужно производить от учетной записи с админскими правами, то перестает работать даже из под этой же учетной записи. Падает с ошибкой 8000401a. Хотя, если выбирать второй вариант — запуск из под запускающего пользователя, то из под этого пользователя работает нормально.

И в настройках безопасности самого Com-объекта и в Мой компьютер -> Безопасность Com все права вроде этому юзеру даны. Больше никаких мест для настройки нет?

И еще вопрос, можно ли как-то настроить все необходимые права на Сом автоматически из программы запущенной с админскими правами?
Re[2]: Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 27.10.10 10:35
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Если в настройках безопасности сервера не указано, от кого запускать, то используется дефолтное значение "подключившийся пользователь". При этом для каждого клиента запускается отдельный экземпляр сервера. Для преодоления нужно изменить в настройках безопасности на запуск от имени либо интерактивного юзера, либо, что лучше, от имени конкретной учётной записи. Кроме того, нужно настроить разрешения на подключение. Подробнее о настройке здесь
Автор: Jolly Roger
Дата: 25.10.10


Вообще может быть проблема в следующем. Вначале мы запускаем дотнет программу, являющуюся Com-сервером, а затем из этой же программы обращаемся к Com-серверу, т.е. как бы сами к себе. Возможно поэтому запуск из под конкретной учетки и не работает, т.к. получается, что с одной стороны мы требуем, что экземпляр Сом-сервера был только один, а с другой он уже запущен под другой учеткой.
Re[3]: Проблема с обращением через Com под пользователем
От: Jolly Roger  
Дата: 27.10.10 13:10
Оценка:
Здравствуйте, Undying, Вы писали:

U>Вообще может быть проблема в следующем. Вначале мы запускаем дотнет программу, являющуюся Com-сервером, а затем из этой же программы обращаемся к Com-серверу, т.е. как бы сами к себе. Возможно поэтому запуск из под конкретной учетки и не работает, т.к. получается, что с одной стороны мы требуем, что экземпляр Сом-сервера был только один, а с другой он уже запущен под другой учеткой.


Не понял, в чём противоречие? Как приложение, обращаясь к самому себе, может обращаться под другой учёткой, если не выполнялась имперсонация?

Может Вы по-подробнее о происходящем у Вас расскажите?
"Нормальные герои всегда идут в обход!"
Re[4]: Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 28.10.10 03:23
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Не понял, в чём противоречие? Как приложение, обращаясь к самому себе, может обращаться под другой учёткой, если не выполнялась имперсонация?


Вот мы запускаем программу, которая является Com-server'ом, под пользователем (User). Соответственно она запускается с правами пользователя. Далее из под этой же программы мы обращаемся к самой себе через Com-интерфейс. Если в настройках данного Com-server'а стоит, что он должен запускаться под учеткой Admin, то что должно происходить? В реальности обращение через Com падает.

Если же вместо запуска под конкретной учеткой стоит запуск из под текущего или запускающего пользователя, то если программа запущена из под пользователя, то поднимается второй экземпляр, что нам не нужно. При запуске программы из пользователя с правами админа все работает нормально. Т.е. непонятно, почему Com считает, что нужно поднять второй экземпляр, если уже есть поднятый Com-сервер с правами пользователя?
Re[6]: Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 28.10.10 04:45
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>А, то есть Вы её сначала вручную запускаете? Тогда конечно, COM проверит соответствие настроек безопасности текущему принципалу и вернёт ошибку. Для таких приложений надо ставить удостоверение "текущий юзер".


Понятно.

JR>Кроме того, внутри приложения создавать объект через COM можно, но не обязательно. Иногда предпочтительней создать объект напрямую, иногда — через COM.


В принципе мы уже решили для встроенных в программу отчетов FastReport Com не использовать, обращаться напрямую к нетовским dll'кам.

JR>Это действительно странно. То есть второй экземпляр запускается под тем-же юзером? А OS у Вас какая? Можете набросать минимальный воспроизводящий ситуацию компилируемый пример?


Да, второй экземпляр запускается под тем же юзером. OS XP Pro. Пример придется с нуля писать, сейчас времени на это нет. Вроде отказ от использования Com в наших стандартных отчетах остроту проблемы снимает, поэтому разбирательство с com'ом пока решили отложить.
Re[7]: Проблема с обращением через Com под пользователем
От: Jolly Roger  
Дата: 28.10.10 05:10
Оценка:
Здравствуйте, Undying, Вы писали:

U>Да, второй экземпляр запускается под тем же юзером. OS XP Pro. Пример придется с нуля писать, сейчас времени на это нет. Вроде отказ от использования Com в наших стандартных отчетах остроту проблемы снимает, поэтому разбирательство с com'ом пока решили отложить.


Но если таки надумаете вернуться к вопросу, дайте знать, любопытно всё-таки
"Нормальные герои всегда идут в обход!"
Re[8]: Проблема с обращением через Com под пользователем
От: Undying Россия  
Дата: 28.10.10 07:38
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Но если таки надумаете вернуться к вопросу, дайте знать, любопытно всё-таки


Хорошо. Я думаю вернемся, т.к. для взаимодействия с той же 1С альтернатив com'у все равно нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.