Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

mxm1975



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ЧЯДНТ (что я делаю не так)?

 
https://stackoverflow.com/questions/2441290/net-json-serialization-of-enum-as-string

Всего записей: 263 | Зарегистр. 31-07-2002 | Отправлено: 23:41 30-08-2018
Kyplon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mxm1975 Спасибо за наводку!
Вопрос решен буквально одной строкой в Startup.cs, в ConfigureServices нужно добавить

Код:
services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });

Результат: JSON со значением "dog"
Что и требуется =)

Всего записей: 164 | Зарегистр. 14-09-2007 | Отправлено: 12:11 31-08-2018 | Исправлено: Kyplon, 12:12 31-08-2018
RemComm



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую.
 
Как выполнять имперсонацию пользователей в процессе, запущенном он обыного (без админ привилегий) пользователя?
 
Поясню.
 
Есть простой WCF сервис на NetTcpBinding с
 
SecurityMode.TransportWithMessageCredential и ClientCredentialType = MessageCredentialType.Windows
 
 
Контракт сервиса:

Код:
[ServiceContract]
public interface ISvc
{
  [OperationContract]
  int TestMethod1(int i);
}

 
Реализация:

Код:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Svc : ISvc
{
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public virtual int TestMethod1(int i)
{
    SqlConnectionStringBuilder sqlcb = null;
    sqlcb = new SqlConnectionStringBuilder()
    {
      DataSource = "(local)",
      IntegratedSecurity = true,
    };
    using (SqlConnection sqlc = new SqlConnection(sqlcb.ConnectionString))
    {
      sqlc.Open();
 
      // get data from SQL
 
      sqlc.Close();
    }
    return i + 1;
  }
}

 
При обращении к методу службы - оная падает с исключением:
 
Can not load file or assembly System.Data.dll .... Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542)
 
И при императивной имперсонации - та же беда:
 
Реализация:

Код:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Svc : ISvc
{
[OperationBehavior(Impersonation = ImpersonationOption.NotAllowed)]
public virtual int TestMethod1(int i)
{
    using (WindowsImpersonationContext ctx = CurrentPrincipal.Identity.Impersonate())
    {
        SqlConnectionStringBuilder sqlcb = null;
        sqlcb = new SqlConnectionStringBuilder()
        {
            DataSource = "(local)",
            IntegratedSecurity = true,
        };
        using (SqlConnection sqlc = new SqlConnection(sqlcb.ConnectionString))
        {
            sqlc.Open();
 
            // get data from SQL
 
            sqlc.Close();
        }
    }
    return i + 1;
  }
}

 
То же исключение выбрасывается при открытии соединения.
 
Согласно интернету, ошибка 0x80070542 - это BAD IMPERSONATION. Однако дальнейшее гугление не привело к понимаю природы такого поведения. Тип привязки не важен - воспроизводится на всех допустимых привязках. При запуске с админ привилегиями - все работает.
 
Как пролечить?

Всего записей: 701 | Зарегистр. 30-09-2003 | Отправлено: 16:53 11-10-2018 | Исправлено: RemComm, 17:27 11-10-2018
RemComm



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашел причину. Теперь код работает как ожидается. Извините за беспокойство.

Всего записей: 701 | Зарегистр. 30-09-2003 | Отправлено: 18:11 13-10-2018
4seasons



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется рабочая программа и программа обновлений рабочей программы (обе написаны на vb.net).
Мне нужно реализовать механизм обновлений своих программ по принципу обновлений самой студии, когда из студии запускается программа обновлений, а после обновления студии из программы обновлений запускается уже обновленная студия.
 
Вопрос:
Как из рабочей программы запустить программу обновлений так, чтобы та после этого смогла заменить рабочую программу на другую версию?
Иначе говоря, как запустить процесс №2 из процесса №1 так, чтобы процесс №2 не был дочерним процессом программы №1?

Всего записей: 1355 | Зарегистр. 31-05-2009 | Отправлено: 18:14 15-10-2018 | Исправлено: 4seasons, 13:27 16-10-2018
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
4seasons
https://www.experts-exchange.com/questions/27399793/Killing-parent-process-without-closing-child-process.html
https://www.google.com/search?hl=en&q=c%23+create+detached+process&sa=X&ved=0ahUKEwi6uY-O34neAhUDx58KHUBeBU0Q1QIImgEoAA

Всего записей: 3907 | Зарегистр. 31-03-2002 | Отправлено: 03:56 16-10-2018 | Исправлено: dneprcomp, 03:57 16-10-2018
4seasons



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Спасибо за ссылки, но оказалось, что я и так все сделал правильно и ничего нового в них не оказалось.
 
Оказывается запуск процесса через
Код:
Process.Start("notepad.exe")
Process.GetCurrentProcess.Kill()  

или через
Код:
retValue = CreateProcess("c:\\windows\\system32\\NotePad.exe", Nothing, IntPtr.Zero, IntPtr.Zero, False, 0, IntPtr.Zero, Nothing, sInfo, pInfo)
Process.GetCurrentProcess.Kill()

дает один и тот же результат, а именно:
родительский процесс освобождается и его программу даже можно удалить, только проблема в том, что дочерний процесс NotePad.exe оказывается привязанным к папке в которой находилась родительская программа, и пока дочерний процесс запущен, с этой папкой ничего поделать нельзя, ни переименовать, ни удалить, а это похоже уже никак не преодолеть.
 
PS
Правда это уже мелочи, просто на пару файловых операций придется сделать больше.
Вместо того, чтобы удалить старую папку и на её место распаковать новую, придется удалять из неё старое содержимое, а затем копировать новое.

Всего записей: 1355 | Зарегистр. 31-05-2009 | Отправлено: 12:47 16-10-2018 | Исправлено: 4seasons, 13:24 16-10-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это потому, что lpCurrentDirectory Nothing.
Текущая директория дочерного процесса тогда будет равна директории, где находится родитель, по этому она и не удаляется.

Всего записей: 1335 | Зарегистр. 01-11-2004 | Отправлено: 13:54 16-10-2018
4seasons



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Цитата:
Это потому, что lpCurrentDirectory Nothing.  

А с этим что-то поделать можно или это просто констатация факта?

Всего записей: 1355 | Зарегистр. 31-05-2009 | Отправлено: 15:26 16-10-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно. Вместо Nothing прописать значение текущей директории для дочернего процесса.

Всего записей: 1335 | Зарегистр. 01-11-2004 | Отправлено: 15:35 16-10-2018
4seasons



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Запустил notepad.exe с одинарными слешами так:

Код:
retValue = CreateProcess("c:\windows\system32\NotePad.exe", Nothing, IntPtr.Zero, IntPtr.Zero, False, 0, IntPtr.Zero, "c:\windows\system32\", sInfo, pInfo)

В результате папка с родительским файлом освободилась и её можно удалить.
 
Только Монитор ресурсов показывает такую картинку:

Причем в качестве lpCurrentDirectory можно указать любую директорию любого диска, например "d:" и на картинку монитора ресурсов это не влияет.

Всего записей: 1355 | Зарегистр. 31-05-2009 | Отправлено: 15:57 16-10-2018 | Исправлено: 4seasons, 20:21 16-10-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В сях \ имеет значение экрана символов переноса строки (\n), табуляции (\t), итд, по этому его самого надо экранировать им же. На C# можно писать @"c:\windows\system32" , если это смущает.

Всего записей: 1335 | Зарегистр. 01-11-2004 | Отправлено: 16:18 16-10-2018
4seasons



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Предыдущий пост переписал.
 
В общем картина более менее ясная.
Чтобы дочерний процесс не занимал родительскую папку, нужно в lpCurrentDirectory указать путь к папке запускаемого процесса, в противном случае он будет держаться за папку родительского каталога.
Как то так ...

Всего записей: 1355 | Зарегистр. 31-05-2009 | Отправлено: 16:20 16-10-2018 | Исправлено: 4seasons, 18:08 16-10-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды



Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru