Чтение и запись в один и тот же файл одновременно из Invoke-RestMethod в PowerShell - PullRequest
0 голосов
/ 25 февраля 2020

У нас есть программа, которая контролирует доступ к двери в наших помещениях. Всякий раз, когда человек открывает дверь со своим тегом, событие регистрируется в базе данных программ. Эти события можно прочитать, включив интеграцию HTTP, что позволяет просматривать их в веб-браузере localhost.

Мы хотим экспортировать просмотренные события из HTTP-URL в Splunk. Для этого я написал сценарий PowerShell, который использует Invoke-RestMethod для извлечения данных из URL-адреса в файл на C:\Scripts, который затем отслеживает Splunk.

Вот сценарий PowerShell, который у меня есть на данный момент:

$getRestMethodParams = @{
    Uri = 'http://localhost:5004/eventexport?end_date=keep'
    Method = 'Get'
    Credential = $Creds
    OutFile = 'C:\Scripts\SplunkOutput.xml'
}
Invoke-RestMethod @getRestMethodParams

Используемый URI будет поддерживать соединение открытым с пульсом с end_date=keep, поэтому мы отслеживаем события в режиме реального времени. Сценарий также выведет результаты в файл 'C:\Scripts\SplunkOutput.xml'. Пока все хорошо.

Тем не менее, код также всегда будет держать файл в открытом / использованном состоянии (из-за параметра heartbeat), что не позволяет Splunk читать из файла, пока я не завершу сценарий, что мы не хотим делать (ну, в какой-то момент нам нужно будет предотвратить слишком большой рост файла, но это будет сделано позже).

Коллега предложил мне попытаться использовать [System.IO.File] чтобы манипулировать потоками файлов, но я только дошел до этого. Это код, который я использовал:

$file = [System.IO.File]::Open('C:\Scripts\SplunkOutput.xml')

$getRestMethodParams = @{
    Uri = 'http://localhost:5004/eventexport?end_date=keep'
    Method = 'Get'
    Credential = $Creds
    OutFile = $file
}
Invoke-RestMethod @getRestMethodParams

К сожалению, это дало мне вывод:

Cannot find an overload for "Open" and the argument count: "1".
At C:\Scripts\SplunkPoller1.ps1:12 char:1
+ $file = [System.IO.File]::Open('C:\Scripts\SplunkOutput.xml')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

, который я также пробовал (из PowerShell Closing FileStream ) :

$inFile = 'C:\Scripts\SplunkOutput.xml'
$inFS = New-Object FileStream($inFile, [FileMode]::Open)

$getRestMethodParams = @{
    Uri = 'http://localhost:5004/eventexport?end_date=keep'
    Method = 'Get'
    Credential = $Creds
    OutFile = $inFS
}
Invoke-RestMethod @getRestMethodParams

Что дало мне:

Unable to find type [FileMode].
At C:\Scripts\SplunkPoller1.ps1:11 char:40
+ $inFS = New-Object FileStream($inFile, [FileMode]::Open)
+                                        ~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (FileMode:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

Буду признателен за все советы о том, как подойти к этому вопросу! Спасибо.

1 Ответ

1 голос
/ 26 февраля 2020

Вместо использования Monitor в вашем inputs.conf, на Windows, вы также можете попробовать использовать MonitorNoHandle, задокументированный на https://docs.splunk.com/Documentation/Splunk/8.0.2/Data/Monitorfilesanddirectorieswithinputs.conf#MonitorNoHandle_syntax

MonitorNoHandle не используйте Windows File Handles для чтения файла, поэтому его можно использовать для файлов, которые остаются открытыми.

...