Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/64: Рейтинг темы: голосов - 64, средняя оценка - 4.73
0 / 0 / 1
Регистрация: 03.03.2017
Сообщений: 16

Мониторинг свободного места на диске

25.09.2017, 09:55. Показов 13129. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте знатоки.

Имеется задача: сделать скрипт, чтобы мониторил свободное место на дисках "C" и "D" Win 2008 серверах и отсылал на почту оповещение если место будет скажем 15 Gb или меньше. Сервера в домене.
Побродив по форумам нашёл примерно такой скрипт:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$MinimumSize = 15GB
$InfoArr = Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" | Where { $_.FreeSpace -lt $MinimumSize }
ForEach ($Info in $InfoArr)
{
  Write-Host "sending mail"
  $mail = New-Object System.Net.Mail.MailMessage
  $mail.From = New-Object System.Net.Mail.MailAddress("почтовый адрес от кого отсылается")
  $mail.To.Add("почтовый адрес куда отсылается")
 
  $mail.Subject = "Недостаточно свободного места.";
  $mail.Body = "На сервере server.net на диске " + $Info.DeviceID + " недостаточно свободного места. Осталось: " + "{0:N0}" -f ($Info.FreeSpace) + "Гб"
 
  $smtp = New-Object System.Net.Mail.SmtpClient
  $smtp.host = "почтовый сервер через который идёт отправка письма"
 
  $Credentials = new-object System.Net.networkCredential
  $Credentials.domain = "название домена"
  $Credentials.UserName = "логин"
  $Credentials.Password = "пароль"
  $smtp.Credentials = $Credentials
 
  $smtp.Send($mail)
}
Выдаёт ошибку что:
Кликните здесь для просмотра всего текста
Exception calling "Send" with "1" argument(s): "Mailbox unavailable. The server
response was: 5.7.1 Client does not have permissions to send as this sender"
At line:22 char:13
+ $smtp.Send <<<< ($mail)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

Прав нету.
Хотя вписываю админскую учётку...

Кто может подсказать всё ли верно в скрипте?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2017, 09:55
Ответы с готовыми решениями:

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

Определить и вывести диск который имеет наибольшее количество свободного места
Добрый день, у меня возникла проблема с powershell нужно написать как я понимаю скрипт маленький, но я в это деле мягко говоря не очень.. ...

Нет свободного места на диске
Alcohol создал образ диска. получилось 2 файла: один 5кб, другой 4580896кб. Тот файл, что за 2Гб нужно переместить в локальный диск Е....

8
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2017, 10:25
Цитата Сообщение от HisokaSpb Посмотреть сообщение
Exception calling "Send" with "1" argument(s): "Mailbox unavailable. The server
response was: 5.7.1 Client does not have permissions to send as this sender"
У вас Exchange сервер? Если да, то убедитесь что действительно есть права на отправку от имени, для этой УЗ.

PowerShell
1
2
$cred = Get-Credential -Credential 'domain\userlogin'
Send-MailMessage -Subject "Test" -Body "Test" -From "userlogin@domain.ru" -To "admin@domain.ru" -SmtpServer "mail.domain.ru" -Credential $cred -Port 587
Цитата Сообщение от HisokaSpb Посмотреть сообщение
$mail = New-Object System.Net.Mail.MailMessage
+ почему не воспользуетесь обычным Send-MailMessage?

PowerShell
1
2
3
4
$encoding = [System.Text.Encoding]::UTF8
$Subject = "Недостаточно свободного места.";
$Body = "На сервере server.net на диске " + $Info.DeviceID + " недостаточно свободного места. Осталось: " + "{0:N0}" -f ($Info.FreeSpace) + "Гб"
Send-MailMessage -Subject $Subj -Body $Body -From $From -To $To -SmtpServer $SMTPServer -Encoding  $encoding -Credential $Credentials
0
0 / 0 / 1
Регистрация: 03.03.2017
Сообщений: 16
25.09.2017, 10:41  [ТС]
получилось тогда так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
$MinimumSize = 15GB
$InfoArr = Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" | Where { $_.FreeSpace -lt $MinimumSize }
ForEach ($Info in $InfoArr)
{
  Write-Host "sending mail"
$encoding = [System.Text.Encoding]::UTF8
$Subject = "Недостаточно свободного места.";
$Body = "На сервере server.net на диске " + $Info.DeviceID + " недостаточно свободного места. Осталось: " + "{0:N0}" -f ($Info.FreeSpace) + "Гб"
Send-MailMessage -Subject $Subj -Body $Body -From $From -To $To -SmtpServer $SMTPServer -Encoding  $encoding -Credential $Cred
$cred = Get-Credential -Credential 'domen\admin'
Send-MailMessage -Subject "Test" -Body "Test" -From "userlogin@domain.ru" -To "admin@domen.ru" -SmtpServer "mail.server.ru" -Credential $cred -Port 587
}
выдаёт запрос пароля...после ввода которого выдаёт ошибку:
Кликните здесь для просмотра всего текста
Send-MailMessage : Cannot validate argument on parameter 'Subject'. The argumen
t is null or empty. Supply an argument that is not null or empty and then try t
he command again.
At line:9 char:26
+ Send-MailMessage -Subject <<<< $Subj -Body $Body -From $From -To $To -SmtpSe
rver $SMTPServer -Encoding $encoding -Credential $Cred
+ CategoryInfo : InvalidData: ( [Send-MailMessage], ParameterBi
ndingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microso ft.Power
Shell.Commands.SendMailMessage

Send-MailMessage : A parameter cannot be found that matches parameter name 'Por
t'.
At line:11 char:166
+ Send-MailMessage -Subject "Test" -Body "Test" -From "userlogin@domain.ru" -To
"admin@domen.ru" -SmtpServer "mail.server.ru" -Credential $c
red -Port <<<< 587
+ CategoryInfo : InvalidArgument: ( [Send-MailMessage], Paramet
erBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerSh ell.Comm
ands.SendMailMessage
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2017, 10:50
Цитата Сообщение от HisokaSpb Посмотреть сообщение
Send-MailMessage : A parameter cannot be found that matches parameter name 'Port'.
Значит у вас PowerShell 2.0 и у Send-MailMessage нет параметра -Port. Обновить PowerShell не планируете? А пока попробуйте не указывать порт.

Цитата Сообщение от HisokaSpb Посмотреть сообщение
Send-MailMessage : Cannot validate argument on parameter 'Subject'. The argumen
t is null or empty. Supply an argument that is not null or empty and then try t
he command again.
Переменная $Subject пустая...
0
0 / 0 / 1
Регистрация: 03.03.2017
Сообщений: 16
25.09.2017, 11:08  [ТС]
а как можно пароль добавить прямо в скрипт чтобы не вводить постоянно?
Пока используем 2.0 чтобы посмотреть что умеет.
без порта - всё равно ошибку выдаёт.

По поводу переменных:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$MinimumSize = 15GB
$InfoArr = Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" | Where { $_.FreeSpace -lt $MinimumSize }
ForEach ($Info in $InfoArr)
{
$SMTPServer = "mail.domen.ru"
$From = "server@domen.ru"
$To = "admin@domen.ru"
$encoding = [System.Text.Encoding]::UTF8
$Subject = "Недостаточно свободного места.";
$Body = "На сервере 24.18 на диске " + $Info.DeviceID + " недостаточно свободного места. Осталось: " + "{0:N0}" -f ($Info.FreeSpace) + "Гб"
Send-MailMessage -Subject $Subject -Body $Body -From $From -To $To -SmtpServer $SMTPServer -Encoding  $encoding -Credential $Cred
$cred = Get-Credential -Credential 'domen\admin'
 
}
теперь вроде все переменные указал, но ругается опять на права:

Кликните здесь для просмотра всего текста
Send-MailMessage : Mailbox unavailable. The server response was: 5.7.1 Client does not have perm
issions to send as this sender
At line:11 char:17
+ Send-MailMessage <<<< -Subject $Subject -Body $Body -From $From -To $To -SmtpServer $SMTPServ
er -Encoding $encoding -Credential $Cred
+ CategoryInfo : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-M
ailMessage], SmtpException
+ FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Comma nds.SendMailMessage

админская учётка как так-то...
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2017, 12:13
Цитата Сообщение от HisokaSpb Посмотреть сообщение
Пока используем 2.0 чтобы посмотреть что умеет.
Уже PS 5 вышел... Если есть возможность, то PS 2 рекомендую заменить хотя бы на 3 или 4, т.к. очень много чего было добавлено/исправлено.

Цитата Сообщение от HisokaSpb Посмотреть сообщение
а как можно пароль добавить прямо в скрипт чтобы не вводить постоянно?
1. Отлаживайте скрипт в PowerShell_ISE - один раз выполните (выполнить выделенное) $cred = Get-Credential -Credential 'domen\admin', а затем сколько угодно пробуйте Send-MailMessage
2. Зачем Get-Credential поместили в скриптблок ForEach? Перед отправкой каждого письма у вас меняется пароль?
3. В вашем скрипте сначала Send-MailMessage пытается использовать переменную $Cred и только потом этой переменной присваивается значение.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
$MinimumSize = 15GB
$cred = Get-Credential -Credential 'domen\admin'
$SMTPServer = "mail.domen.ru"
$From = "server@domen.ru"
$To = "admin@domen.ru"
$encoding = [System.Text.Encoding]::UTF8
$Subject = "Недостаточно свободного места."
 
ForEach ($Info in Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" | Where { $_.FreeSpace -lt $MinimumSize })
{
    $Body = "На сервере 24.18 на диске " + $Info.DeviceID + " недостаточно свободного места. Осталось: " + "{0:N0}" -f ($Info.FreeSpace) + "Гб"
    Send-MailMessage -Subject $Subject -Body $Body -From $From -To $To -SmtpServer $SMTPServer -Encoding $encoding -Credential $Cred
}
4. Если очень нужно сохранить логин/пароль для дальнейшего использования в скриптах, тогда примерно так:

PowerShell
1
2
3
4
5
6
#Один раз сохраняете Credential
$cred = Get-Credential -Credential 'domain\userlogin'
$cred | Export-CliXml -Path 'C:\Temp\cred.xml'
 
#Далее в любом нужном скрипте используете эти Credential
$cred = Import-CliXml -Path 'C:\Temp\cred.xml'
Цитата Сообщение от HisokaSpb Посмотреть сообщение
Send-MailMessage : Mailbox unavailable. The server response was: 5.7.1 Client does not have prmissions to send as this sender
Если у вас Exchange-сервер, то у пользователя от имени которого запущен этот скрипт должны быть AD-права SendAs на адрес отправителя и тогда даже -Credential указывать не нужно.
0
0 / 0 / 1
Регистрация: 03.03.2017
Сообщений: 16
25.09.2017, 15:17  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
4. Если очень нужно сохранить логин/пароль...
ведь у вас в скрипте как я вижу домен\логин сохраняется...а пароль где?


Цитата Сообщение от KDE777 Посмотреть сообщение
Если у вас Exchange-сервер, то у пользователя от имени которого запущен этот скрипт должны быть AD-права SendAs на адрес отправителя и тогда даже -Credential указывать не нужно.
если exchange обслуживают иностранцы и соответственно все админки у них?

Добавлено через 45 секунд
Цитата Сообщение от KDE777 Посмотреть сообщение
4. Если очень нужно сохранить логин/пароль...
ведь у вас в скрипте как я вижу домен\логин сохраняется...а пароль где?


Цитата Сообщение от KDE777 Посмотреть сообщение
Если у вас Exchange-сервер, то у пользователя от имени которого запущен этот скрипт должны быть AD-права SendAs на адрес отправителя и тогда даже -Credential указывать не нужно.
если exchange обслуживают иностранцы и соответственно все админки у них?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2017, 18:48
Цитата Сообщение от HisokaSpb Посмотреть сообщение
ведь у вас в скрипте как я вижу домен\логин сохраняется...а пароль где?
Если вы про это:

PowerShell
1
$cred = Get-Credential -Credential 'domain\userlogin'
То Get-Credential показывает интерактивное окно с запросом пароля. Введённые данные сохраняются в переменной $cred, которая пропадает после завершения работы скрипта. Как сохранить пароль в зашифрованный файл, а затем им воспользоваться я уже показывал.


Цитата Сообщение от HisokaSpb Посмотреть сообщение
если exchange обслуживают иностранцы и соответственно все админки у них?
Разрешение SendAs может дать не только Exchange администратор. Если есть права на изменение соответствующего AD-объекта, то можно предоставить такие права просто через ADUC-оснастку
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.09.2017, 18:50
Вы для начала просто запустите PS от имени пользователя, у которого есть почтовый ящик (userlogin@domain.ru) и проверьте отправку:

PowerShell
1
Send-MailMessage -Subject "Test" -Body "Test" -From "userlogin@domain.ru" -To "admin@domain.ru" -SmtpServer "mail.domain.ru"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.09.2017, 18:50
Помогаю со студенческими работами здесь

Нет свободного места на диске
Здравствуйте!У меня забит диск на MacBook Pro retina 13.Пишет что забито 20 гб фильмами,которых у меня нет!Может где-то они глубоко...

Мало свободного места на диске С
На диске С всего 5 гигов памяти: 3 - занято Windows, остальные 2 - не знаю чем :(. Все программы установлены на диск D. Помогите освободить...

На диске не хватает свободного места
Добрый день,извените меня за наглость,немагу найти или правильно определиться куда можно обратиться,в какой раздел,по вопросу записи дисков...

Увеличение свободного места на диске.
Проблема заключается в следующем: диск разделен на 2 раздела. На первом только сама винда. На втором все остальное. По глупости отвел...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru