Позначте мережевий накопичувач, який використовуватиме служба


213

Припустимо, деяка служба Windows використовує код, який бажає відображених мережевих накопичувачів і не має шляхів UNC. Як я можу зробити відображення диска доступним для сеансу служби при запуску служби? Увійти як користувач служби та створити стійке відображення не встановить відображення в контексті фактичної послуги.


6
Дивіться відповідь ForcePush, його вирішення.
Ubikuity

Відповіді:


44

Вам потрібно буде або змінити службу, або загорнути її в допоміжний процес: окрім проблем із сеансом / доступом до диска, стійкі відображення диска відновлюються лише на інтерактивному вході, який служби зазвичай не виконують.

Підхід до процесу помічників може бути досить простим: просто створіть нову службу, яка відображає накопичувач і запускає «справжню» послугу. Єдині речі, які не є цілком тривіальними з цього приводу, це:

  • Службі помічників потрібно буде передати всі відповідні команди SCM (запуск / зупинка тощо) реальній службі. Якщо реальна служба приймає власні команди SCM, не забудьте передавати їх також (я не сподіваюся, що служба, яка вважає шляхи UNC екзотичними, використовувати такі команди, хоча ...)

  • Речі можуть стати делікатними. Якщо реальна послуга працює під звичайним обліковим записом користувача, ви також можете запустити службу помічника під цим обліковим записом, і все повинно бути добре, доки обліковий запис має відповідний доступ до загальної мережі. Якщо справжня служба працюватиме лише під час запуску як LOCALSYSTEM або щось подібне, речі стають цікавішими, оскільки вони взагалі не зможуть "побачити" мережевий диск, або вимагатимуть деякого жонглювання обліковими записами, щоб змусити роботу працювати.


2
Дуже інформативно ... Чи правильно я припускаю, що сценарії входу також виконуються лише для інтерактивних сеансів входу, а не для сервісних сесій?
VoidPointer

220

Використовуйте це на свій страх і ризик. (Я протестував це на XP та Server 2008 x64 R2)

Для цього злому вам знадобиться SysinternalsSuite від Марка Русиновича :

Перший крок: відкрийте піднесений запит cmd.exe (Запустити як адміністратор)

Крок другий: Піднесіть ще раз до root, використовуючи PSExec.exe: Перейдіть до папки, що містить SysinternalsSuite, і виконайте наступну команду, psexec -i -s cmd.exe яку ви зараз усередині підкажете, nt authority\systemі це можна довести, ввівши whoami. -iНеобхідно , оскільки відображення дисків повинні взаємодіяти з користувачем

Крок третій: Створіть стійкий відображений накопичувач як обліковий запис SYSTEM за допомогою наступної команди net use z: \\servername\sharedfolder /persistent:yes

Це так просто!

ПОПЕРЕДЖЕННЯ : Ви можете видалити це зіставлення лише тим же способом, яким ви його створили, з облікового запису СИСТЕМИ. Якщо вам потрібно його видалити, виконайте кроки 1 і 2, але змініть команду на кроці 3 на net use z: /delete.

ПРИМІТКА . Новостворений відображений накопичувач тепер з’явиться для ВСІХ користувачів цієї системи, але вони побачать його як "Відключений мережевий диск (Z :)". Не дозволяйте, щоб ім’я вас обдурило. Він може претендувати на відключення, але він буде працювати для всіх. Ось як ви можете сказати, цей хак не підтримується M $.


3
Я намагався використати це рішення і зіткнувся з цією проблемою: відображений на карті відображений як відключений для користувачів (навіть адміністраторів). Будь-які пропозиції?
Костянтин Бацю

7
Після перезавантаження відображений накопичувальний привід відсутній. Якісь ідеї? Зображення зберігається, але статус "Недоступний", тому він не відображається
Tommy

4
Я також вважаю, що відображення не є доступним після перезавантаження.
Дейв Паттерсон

33
Для того, щоб отримати його роботу після перезавантаження, створіть сценарій просто , що містить net use z: \\servername\sharedfolderі налаштувати його для запуску під час завантаження комп'ютера, на technet.microsoft.com/en-us/library/cc770556.aspx Це буде працювати в якості облікового запису SYSTEM, тому немає необхідності в psexec.
TRS-80

2
Хочу додати, що важливо, щоб усі користувалися пунктом /USER:[remotecomp]\[remoteusername] [password](команда не працює належним чином іноді, коли віддалене ім'я користувача не передує іменем віддаленого комп’ютера та зворотній косою рисою. Також, якщо поділка захищена паролем і видається для інших як відключена диск, він НЕ доступний для всіх. Будь-який користувач у тій системі, де SYSTEM монтує спільну частку, повинен знати пароль до цієї спільної інформації (тестовано на XPx64)
Kitet

65

Я знайшов рішення, схоже на рішення з psexec, але працює без додаткових інструментів і переживає перезавантаження .

Просто додайте розкладене завдання, вставте "систему" в поле "запустити як" і вкажіть завдання на пакетний файл за допомогою простої команди

net use z: \servername\sharedfolder /persistent:yes

Потім виберіть "запустити при запуску системи" (або подібне, у мене немає англійської версії), і ви закінчите.


що починається спочатку? служба Windows або це заплановане завдання? наша служба вмирає на старті, якщо шлях недоступний. Ми повинні були б відновити це, якщо служба запускається останнім часом.
Томас

1
Я спробував це на 2008 R2, він створює відключений диск з картами, і коли я намагаюся відкрити те саме, він говорить "z: \ недоступний. Помилка входу: невідоме ім'я користувача або неправильний пароль." Але мені вдалося створити відображений привід успішно, запустивши той самий файл bat вручну. Ny розуміння?
Гопі

1
@Thomas не важливо, що починається спочатку, якщо завдання було виконано хоча б один раз через/persistent:yes
Edd

4
Чому це потрібно робити плановим завданням? Це / наполегливо: так, хіба цього недостатньо, щоб тримати його навколо?
Скотт Стаффорд

2
@ScottStafford Ні / стійкий: так, недостатньо для Win7 та пізніших версій. Зображення видаляється після перезавантаження, незалежно від цього перемикача.
Вічний21

44

Кращим способом було б використання символічного посилання за допомогою mklink.exe. Ви можете просто створити посилання у файловій системі, яке може використовувати будь-який додаток. Дивіться http://en.wikipedia.org/wiki/NTFS_symbolic_link .


Так просто і добре працює. Оскільки вона є частиною файлової системи, посилання доступне для всіх облікових записів. Просто переконайтеся, що служба працює як обліковий запис, який має доступ до мережевого ресурсу (що може не стосуватися системи тощо).
Джеремі Френк

1
Це ЗАВДАНО краща відповідь на питання, велике спасибі!
Стен Петров

3
На жаль, якщо посилання sym має доступ до спільної мережі, то ви повернетесь до квадратного
davidfrancis

23

Тут є хороша відповідь: https://superuser.com/a/651015/299678

Тобто Ви можете використовувати символічне посилання, наприклад

mklink /D C:\myLink \\127.0.0.1\c$

1
Що робити, якщо ви спробуєте створити каталог із сервісу помилку дозволу?
tyoc213

Вам слід перенести це повідомлення в режим чату до кімнати чату, а потім надати детальну інформацію про повідомлення про помилку. Можливо, вам потрібно запустити команди з підвищеними дозволами.
філу

@ tyoc213 Ви отримали відповідь?
Lsakurifaisu

9

Ви можете нам скористатися командою 'net use':

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

Якщо це не працює в сервісі, спробуйте Winapi і PInvoke WNetAddConnection2

Редагувати: Очевидно, я вас зрозумів неправильно - ви не можете змінити вихідний код послуги, правда? У такому випадку я б дотримувався пропозиції від mdb , але з невеликим поворотом: Створіть свій власний сервіс (давайте назвемо його картографічним сервісом), який відображає диск та додасть цю послугу картування до залежностей для першої (фактично працюючої) служби. Таким чином робоча служба не запуститься до того, як послуга картографування запуститься (і відобразить привід).


з цією настройкою служби картографування, я думаю, що відображення дисків, встановлене службою картографування, було б недоступне в контексті оригінальної послуги, чи не так?
VoidPointer

Я думаю, що <disclaim> повинно </disclaim> - для кожного сеансу winlogon є лише одне середовище.
Треб

Ваш код працює в сервісі. Я приїхав сюди з тим же питанням, що й ОП, але я є автором Служби. Ваша відповідь вирішила мою проблему.
Джо Гейетті

5

ForcePush,

ПРИМІТКА . Новостворений відображений накопичувач тепер з’явиться для ВСІХ користувачів цієї системи, але вони побачать його як "Відключений мережевий диск (Z :)". Не дозволяйте, щоб ім’я вас обдурило. Він може претендувати на відключення, але він буде працювати для всіх. Ось як ви можете сказати, цей хак не підтримується M $ ...

Все залежить від дозволу на частку. Якщо у вас є всі права доступу до спільного доступу, цей відображений диск буде доступний для інших користувачів. Але якщо у вас є лише якийсь конкретний користувач, чиї облікові дані ви використовували в пакетному сценарії, і цей пакетний сценарій був доданий до сценаріїв запуску, лише системний обліковий запис матиме доступ до цієї спільної доступу, навіть не адміністратор. Отже, якщо ви використовуєте, наприклад, заплановане завдання ntbackuo, системний обліковий запис повинен бути використаний у "Запустити як". Якщо ваша послуга "Увійти як: Обліковий запис локальної системи", вона повинна працювати.

Що я зробив , я не зіставляв жодної літери диска в моєму сценарії запуску, просто використовував net use \\\server\share ...і використовував UNC шлях у своїх запланованих роботах. Додано сценарій входу (або просто додати пакетний файл у папку запуску) із відображенням на ту саму спільну частину з деяким листом диска: net use Z: \\\...з тими ж обліковими записами. Тепер користувач, який зареєструвався, може бачити та отримати доступ до цього зібраного диска. Є 2 підключення до тієї самої частки. У цьому випадку користувач не бачить цього дратівливого "Відключеного мережевого накопичувача ...". Але якщо вам дійсно потрібен доступ до цієї папки за допомогою букви диска, а не лише UNC, зробіть карту, яка ділиться різними літерами диска, наприклад Y для системи та Z для користувачів.


4

Знайшов спосіб надати службі Windows доступ до мережевого диска.

Візьмемо для прикладу Windows Server 2012 з NFS Disk:

Крок 1. Напишіть пакетний файл на горіння.

Напишіть пакетний файл, напр .: C: \ mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

Крок 2: Встановіть диск як NT AUTHORITY / SYSTEM.

Відкрийте "Планувальник завдань", створіть нове завдання:

  1. Запустіть як "СИСТЕМА" у "Запуск системи".
  2. Створіть дію: запустіть "C: \ mount_nfs.bat".

Після цих двох простих кроків моя служба Windows ActiveMQ, що працює під приватним доступом "Локальна система", працює бездоганно без входу.


3

Причина, через яку ви можете отримати доступ до накопичувача, коли ви зазвичай запускаєте виконуваний файл з командного рядка, полягає в тому, що коли ви виконуєте його як звичайний exe, ви запускаєте цю програму в обліковому записі користувача, з якого ви ввійшли в систему. І цей користувач має привілеї на доступ до мережі. Але, коли ви встановлюєте виконуваний файл як службу, за замовчуванням, якщо ви бачите в управлінні завданням, він працює під обліковим записом "SYSTEM". І ви, можливо, знаєте, що "СИСТЕМА" не має прав на доступ до мережевих ресурсів.

Вирішити цю проблему можна двома.

  1. Щоб відобразити пристрій настільки стійким, як уже вказувалося вище.

  2. Є ще один підхід, якого можна дотримуватися. Якщо ви відкриєте диспетчер сервісів, ввівши "services.msc", ви можете перейти до своєї послуги, а у властивостях вашої служби є вкладка logOn, де ви можете вказати обліковий запис як будь-який інший обліковий запис, крім "Система", ви можете або запустити послугу з власного входу в обліковий запис користувача або через «Служба мережі». Коли ви це зробите .. сервіс може отримати доступ до будь-якого мережевого компонента та керувати, навіть якщо вони також не є стійкими. Щоб досягти цього програмно, ви можете переглянути функцію "CreateService" за адресою http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx, а для параметра "lpServiceStartName" встановити значення "NT ВЛАДА \ NetworkService '. Це розпочне вашу послугу в розділі "Служба мережі"

  3. Ви також можете спробувати зробити послугу інтерактивною, вказавши SERVICE_INTERACTIVE_PROCESS у прапорі параметра сервісного типу функції CreateService (), але це буде обмежено лише до XP, оскільки Vista та 7 не підтримують цю функцію.

Сподіваюся, що рішення допоможуть вам. Повідомте мене, чи спрацювало це для вас.


1

Ви не бажаєте або змінювати користувача, під яким працює Служба, з "Система", або знайти підлий спосіб запустити ваше відображення як Система.

Найцікавіше, що це можливо за допомогою команди "at" , просто заплануйте відображення вашого диска на одну хвилину в майбутнє, і воно буде запускатися під системним обліковим записом, завдяки чому диск стане видимим для вашої служби.


послуга не працює як "Система". Він створений для роботи під певним локальним рахунком. Навіть я входжу з цим обліковим записом, створюю стійке картографічне відображення в мережі, виходжу з системи та перезавантажую сервіс, відображення не буде доступне для сервісу.
VoidPointer

1

Замість того, щоб покладатися на постійний диск, ви можете встановити сценарій для відображення / скасування карти при кожному використанні:

net use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
net use Q: /delete

Це працює для мене.


0

Я поки не можу коментувати (працюю над репутацією), але створив обліковий запис просто для відповіді на проблеми @Tech Jerk @ spankmaster79 (приємне ім’я, хаха) та @NMC, про які вони повідомили у відповідь на "Я знайшов рішення, схоже на те, що psexec, але працює без додаткових інструментів і переживає перезавантаження ". повідомлення @Larry зробив.

Рішення цього полягає в тому, щоб просто перейти до цієї папки з зареєстрованого облікового запису, тобто:

    \\servername\share  

і дозвольте йому запросити увійти та введіть ті самі облікові дані, які ви використовували для UNC в psexec. Після цього він починає працювати. У моєму випадку я думаю, що це тому, що сервер із сервісом не є членом того самого домену, що і сервер, на який я збираюсь. Я думаю, якщо UNC і заплановане завдання обидва посилаються на IP замість імені хоста

    \\123.456.789.012\share 

це може взагалі уникнути проблеми.

Якщо я коли-небудь отримаю достатньо точок повторень, я додаю це як відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.