|
Установка "компонента Windows"/"Роли на сервере" программно
|
|||
---|---|---|---|
#18+
Если делать ручками: Панель управления -> Программы -> Включение и отключение компонентов Windows В окне Компоненты Windows: Нашел компонент, проверил есть ли галка Если нет, поставил нажал OK. Ну и ждем, бывает долго, пока установится. На Win сервере речь может идти об установки "роли сервера". При этом также бывает нужно установить компонент(ы) от которого работоспособность устанавливаемого зависит. Мне это надо сделать программно, желательно с "progress", ибо процесс как правило не быстрый. Нечто подобное делал очень давно, но дальше XP/2003 метод никогда не работал т.е. не актуально. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
(код вызывает системные окна, как бы я это делал из панели управления ручками и устанавливает <имя_компонента>. Вот надо сие сделать для современных OS (начать хотя б с клиентской Win10, для сервера требуются "роли"). Да и лучше чтоб не через сомнительную cmd, хотя и это вариант. Пока погуглив нашел: Deployment Image Servicing and Management (DISM) API cmd-вариант: Включение и отключение компонентов Windows с помощью DISM Оно? Или есть еще какие варианты? Что .Net говорит на эту тему? Не повредил бы хороший пример без излишеств и лишних опций. Т.е. надо сделать ровно то что я описал: "поставить галку на компонент" и "нажать OK", без указания образов, прообразов, хранилищ и т.п. Если система захочет установочный CD, DVD, Windows Update, пусть сама это запрашивает и сама туда идет если сочтет нужным и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 07:28 |
|
Установка "компонента Windows"/"Роли на сервере" программно
|
|||
---|---|---|---|
#18+
Ну с DISM я в общем-то разобрался. Код: vbnet 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. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286.
+ полный тест-проект целиком в приложении (с выводом всех фич в комбобокс, опроса их по одной и возможности установки/удаления любой). Даб не быть голословным. Есть ньюанс: на x64 надо компилировать строго в 64-битный код (32 битный exe-шник работать не будет). Но эта штука штатно работает только на Win8.1/10 (вероятно и на 8=) и на серверах (фичи и роли). Пробовал на 2012R2, очевидно будет и на 2016-м. А вот с Win7 задница. Во первых DISM там штатно то ли отсутсвует, то ли установлен черт знает где (у меня есть в System32/CompatTel но не уверен о его родном происхождении). У кого есть семерка, не глянете? Путь этот конечно можно дописать через SetEnvironmentVariable("Path", varValue). Но есть жирное НО. На Win7 не работает ключ /Enable-Feature /All при установке фичи (ни через API ни через Dism.exe -87 ошибка). Причем установка ADK как MS советует проблемы с /All не решает. Можно конечно извратиться, последовательно найти все ParentFeatures и доустановить поотдельности, но с учетом количества проблем стоит ли эту технику вообще иметь ввиду для 7-ки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2017, 07:15 |
|
Установка "компонента Windows"/"Роли на сервере" программно
|
|||
---|---|---|---|
#18+
Коль уж тему начал. Но есть жирное НО. На Win7 не работает ключ /Enable-Feature /All при установке фичи (ни через API ни через Dism.exe -87 ошибка). Причем установка ADK как MS советует проблемы с /All не решает. Можно конечно извратиться, последовательно найти все ParentFeatures и доустановить поотдельности, но с учетом количества проблем стоит ли эту технику вообще иметь ввиду для 7-ки. Осилил я этот момент. На Win7 рекурсивно вычисляем все неустановленные Parent фичи, и засовываем в строку через ";". Не знаю насколько это важно, но Parent всегда раньше чем Child. Код: vbnet 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.
Строку эту подсовываем в DismEnableFeature function без многократных вызовов (To enable more than one feature, separate each feature name with a semicolon.) Параметр EnableAll ставим строго в False (Note LimitAccess, SourcePaths, SourcePathCount, and EnableAll are only supported on Windows 8 and Windows Server 2012.) Собственно в MSDN все сказано. И походу DISM на Win7 таки уже родной tool (pkgmgr рисует Dism-овский лог). Хотя надо делать SetEnvironmentVariable (+ "System32/CompatTel" в 'Path'), иначе dismapi.dll не найдет. Ну вот собственно все. Тест-проект с учетом сказанного прикладываю. Там подправил еще несколько глюков: 1) Видимо не стоит передавать Object в API вместо IntPtr 2) Callback имеет свойство частенько глючить(во всяком случае на Win7 x86, на новых x64 не замечено), это когда Current>Total, Value>Max в приаттаченном ProgressBar и краш обеспечен, это надо обрабатывать 3) Любая ошибка >0 в Dism-функциях не ошибка, всегда надо проверять на FAILED (т.е. <0) а не S_OK. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2017, 05:52 |
|
|
start [/forum/topic.php?fid=20&msg=39417511&tid=1400007]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 276ms |
total: | 407ms |
0 / 0 |