Скрипт для создания файла, доступного для записи на всех машинах в домене

362
mwh87

Все еще новичок в powershell, но мне было поручено выяснить, как создать и запустить скрипт powershell на каждой рабочей станции в нашем домене, чтобы он получал статус Bitlocker и затем записывал информацию в файл csv. Мы используем labtech в качестве нашей удаленной системы, поэтому мы хотим запускать скрипт на каждой машине, так как наш инженер не хочет, чтобы что-либо запускалось на самом DC (изначально он собирался извлечь все имена рабочих станций из OU и затем проверить состояние каждой из них. ). Проблема в том, что кажется, что первый компьютер, на котором выполняется сценарий, создает файл, а затем вступает во владение, эффективно блокируя все другие машины для записи в файл. Любые предложения направить меня в правильном направлении приветствуются. Благодарю.

$Computer = hostname Write-Host "Getting Bitlocker Status..." -ForegroundColor Green  function ErrorLog { $ErrorMessage = $_.Exception.Message $Date = Get-Date $Date ERROR: "$ErrorMessage" | out-file *path* -Append  exit } try { $Status = manage-bde C: -cn $Computer -status | Select-String "Conversion Status:", "Percentage Encrypted:", "Protection Status:", "Lock Status:" } catch { ErrorLog  } finally { $Date = Get-Date "$Date Successful BitLocker Check" | out-file *path* -Append }  Write-Host "Sending info to CSV file..." -ForegroundColor Green  try{ $ConvStatus = $Status.line | Select-String "Conversion Status:" $Percentage = $Status.line | Select-String "Percentage Encrypted:" $LockStatus = $Status.line | Select-String "Lock Status:" $Object = New-Object PSObject -Property @{ ComputerName = $Computer ConversionStatus = $ConvStatus.ToString().trim("Conversion Status:") PercentageEncrypted = $Percentage.ToString().trim("Percentage Encrypted:") LockStatus = $LockStatus.ToString().trim("Lock Status:") }  $Object | Select-Object ComputerName, ConversionStatus, PercentageEncrypted, LockStatus | Export-CSV *path* -NoTypeInformation -Append -Force }  catch { ErrorLog } finally { $Date = Get-Date "$Date CSV written to $Path" | out-file *path* -Append  } 
0
Если вы не можете запустить скрипт на контроллере домена, не можете ли вы запустить его на другом компьютере? Это значительно облегчит обслуживание. Т.е. будет только один скрипт, и не будет проблем с правами доступа к файлам. Berend 5 лет назад 0
Мой оригинальный сценарий извлек все имена рабочих станций из подразделения Workstations и использовал цикл foreach для проверки состояния на каждом компьютере и добавления файла csv. К сожалению, кажется, что только DC имеет установленную функцию bitlocker, поскольку другие серверы не распознают manage-bde. Наш инженер не хочет, чтобы функция битлокера была установлена ​​на других серверах ... даже на сервере UTIL. Все остальные наши рабочие станции находятся в разных подсетях в зависимости от их местоположения, поэтому я не могу удаленно проверять состояние на всех машинах с моей рабочей станции. Кажется, я застрял mwh87 5 лет назад 0

3 ответа на вопрос

1
harrymc

Одновременная запись всех компьютеров в один и тот же файл не является хорошим решением. Было бы гораздо предпочтительнее запрашивать состояние Bitlocker всех рабочих станций с одного центрального компьютера домена.

Используемая команда - manage-bde, например, такая как:

manage-bde -status -computername WS12345 C: 

Что может дать такой вывод:

image

Вы можете написать скрипт, который собирает информацию в один файл CSV.

Рекомендации :

  • Проверка состояния шифрования удаленных компьютеров Windows
  • Сценарий Technet PowerShell для удаленного запроса каждого компьютера, найденного в указанном подразделении (с использованием manage-bde.exe), чтобы определить, включена или отключена защита BitLocker, и сообщить об этом в выводе с цветовой кодировкой. Результаты будут сохранены в файл CSV и отправлены по электронной почте указанным получателям. Просто измените необходимые переменные и запустите.
  • Сценарий Technet PowerShell для получения статуса шифрования BitLocker для нескольких компьютеров.
+1 Строго говоря, это не ответ на вопрос, но я думаю, что он * действительно * объясняет, что ОП должен делать. (http://xyproblem.info/) Berend 5 лет назад 1
Это был мой первоначальный план, однако мне нужно было работать на сервере, так как все рабочие станции находятся в разных подсетях, поэтому я не могу запустить это удаленно со своей рабочей станции. Наш инженер не позволяет устанавливать функцию битлокера на сервере UTIL и не позволяет мне запускать скрипт на контроллере домена. Вот почему я придумал этот грязный способ получить отчет mwh87 5 лет назад 0
Вы можете запустить скрипт один раз для каждого сегмента - он не должен выполняться из DC. Затем объедините отдельные файлы CSV в один. harrymc 5 лет назад 0
@Berend: Спасибо за приятную ссылку, которую нужно запомнить. harrymc 5 лет назад 0
0
Berend

Вы можете просто позвонить в icacls, чтобы предоставить всем полный доступ:

icacls myfile.csv /grant everyone:F 

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

Вот ссылка на статью, которая описывает, как сделать это способом Powershell. Это немного дольше, и в этом случае я бы предпочел сам вышеупомянутый oneliner. Я немного изменил пример с этой страницы:

$Path = 'myfile.csv' $Acl = (Get-Item $Path).GetAccessControl('Access') $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('Everyone', 'FullControl', 'Allow') $Acl.SetAccessRule($Ar) Set-Acl -path $Path -AclObject $Acl 

Кстати, вы рассмотрели, что произойдет, если два компьютера будут писать в этот файл одновременно?

-1
mwh87

Мне удалось убедить нашего инженера внести некоторые изменения, и теперь я успешно запускаю свой оригинальный скрипт через наш UTIL-сервер. Спасибо всем за помощь!

Ваш ответ будет более полезен для будущих читателей, если вы запишите, какие изменения внес ваш инженер, иначе это никому не поможет. DavidPostill 5 лет назад 0