PowerShell日志记录功能未写入数据。

huangapple go评论71阅读模式
英文:

PowerShell logging function is not writing data

问题

#变量
$rootDir = "\\server1\share1"
$logDir = "c:\temp"
$date = (Get-Date -Format "MMddyyyy-HHmm")
$logData =@()

#我的记录函数
Function CreateLog {
    #创建对象以存储属性
    $logObj = New-Object -TypeName psobject -Property @{
        FolderPath = $Folder.Fullname
        IdentityReference = $ACL.IdentityReference.ToString()
        folder = $Folder[0]
        FileSystemRights = $ACL.FileSystemRights.ToString()
        InheritanceFlags = $ACL.InheritanceFlags.ToString()
    }

$Folders=(Get-ChildItem -Path $rootDir -Directory -Recurse)

foreach ($Folder in $Folders){

    $ACLs = get-acl $Folder.fullname | ForEach-Object {$_.Access}
    Foreach ($ACL in $ACLs){
        CreateLog
        if($ACL.FileSystemRights -eq "FullControl"){ 
            Write-Host "DO SOMETHING" 
        }
    }

$logData | select folder,IdentityReference,FileSystemRights,InheritanceFlags,FolderPath | Format-Table -Wrap | Out-File $logDir\testlog-$date.log -Append
英文:

I am trying to create a reusable log function for a project I am working on in PowerShell. I am a novice with PowerShell so I am having problems figuring out why my function is not producing expected results. I am attempting to create a function that send NTFS/ACL details to a log file. This function will be incorporated in to a larger script that will change some NTFS/ACL/ACE folder rights. I have excluded some of the other code for simplification (changing rights).

Below is my current stripped down code. When it runs, it creates the log file but the file is empty. If I move the line of code that creates the log inside the log function, it creates the log file with data but it is not formatted correctly - it writes the heading (object attribute names) on one line, then the data, then then a new line with the heading, then the data. I want it to write the heading, then a line of data, line of data, .... Before I created a function for this, it worked as expected. I am a novice at PowerShell so I may not understand how to pass info in and out of the function. My Code:

#variables
$rootDir = "\\server1\share1"
$logDir = "c:\temp"
$date = (Get-Date -Format "MMddyyyy-HHmm")
$logData =@()

#My Logging Function
Function CreateLog {
    #create and object to store attributes
    $logObj = New-Object -TypeName psobject -Property @{
        FolderPath = $Folder.Fullname
        IdentityReference = $ACL.IdentityReference.ToString()
        folder = $Folder[0]
        FileSystemRights = $ACL.FileSystemRights.ToString()
        InheritanceFlags = $ACL.InheritanceFlags.ToString()
    }

$Folders=(Get-ChildItem -Path $rootDir -Directory -Recurse)

foreach ($Folder in $Folders){

    $ACLs = get-acl $Folder.fullname | ForEach-Object {$_.Access}
    Foreach ($ACL in $ACLs){
        CreateLog
        if($ACL.FileSystemRights -eq "FullControl"){ 
            Write-Host "DO SOMETHING" 
        }
    }

$logData | select folder,IdentityReference,FileSystemRights,InheritanceFlags,FolderPath | Format-Table -Wrap | Out-File $logDir\testlog-$date.log -Append

答案1

得分: 0

我认为您是在寻找类似这样的内容:

# 变量
$rootDir = "\\server1\share1"
$logDir  = "c:\temp"
$date    = Get-Date -Format "MMddyyyy-HHmm"

# 我的日志函数
Function CreateLog {
    param(
        [Parameter(Mandatory)]
        [System.Security.AccessControl.FileSystemAccessRule] $AccessRule,

        [Parameter(Mandatory)]
        [string] $Folder
    )

    [pscustomobject]@{
        FolderPath        = $Folder
        IdentityReference = $AccessRule.IdentityReference
        FileSystemRights  = $AccessRule.FileSystemRights
        InheritanceFlags  = $AccessRule.InheritanceFlags
    }
}

Get-ChildItem -Path $rootDir -Directory -Recurse | ForEach-Object {
    foreach($rule in ($_ | Get-Acl).Access) {
        CreateLog -AccessRule $rule -Folder $_.FullName

        if($rule.FileSystemRights.HasFlag([Security.AccessControl.FileSystemRights]::FullControl)) {
            # 在这里执行一些操作
        }
    }
} | Export-Csv $logDir\testlog-$date.log -NoTypeInformation

您当前的代码存在一些语法错误(缺少 }),您的函数似乎将对象分配给 $logObj,但然后从中不输出 $logObj,因此没有产生任何输出。

您定义了 $logData 数组,但从未使用过,更不用说在这种情况下根本不需要。理想情况下,您的函数应该接受访问规则和路径的参数,请参阅带参数的函数以了解更多信息。

Format-Table以及其他 Format-* 命令应主要用于控制台显示,不应用于导出数据。在这种情况下,您应该使用Export-Csv,这样您的数据会保留其结构,可以轻松导入、筛选和排序。

英文:

I assume you're looking for something like this:

#variables
$rootDir = "\\server1\share1"
$logDir  = "c:\temp"
$date    = Get-Date -Format "MMddyyyy-HHmm"

#My Logging Function
Function CreateLog {
    param(
        [Parameter(Mandatory)]
        [System.Security.AccessControl.FileSystemAccessRule] $AccessRule,

        [Parameter(Mandatory)]
        [string] $Folder
    )

    [pscustomobject]@{
        FolderPath        = $Folder
        IdentityReference = $AccessRule.IdentityReference
        FileSystemRights  = $AccessRule.FileSystemRights
        InheritanceFlags  = $AccessRule.InheritanceFlags
    }
}

Get-ChildItem -Path $rootDir -Directory -Recurse | ForEach-Object {
    foreach($rule in ($_ | Get-Acl).Access) {
        CreateLog -AccessRule $rule -Folder $_.FullName

        if($rule.FileSystemRights.HasFlag([Security.AccessControl.FileSystemRights]::FullControl)) {
            # Do something here
        }
    }
} | Export-Csv $logDir\testlog-$date.log -NoTypeInformation

Your current code has a few syntax errors (missing }), your function seem to be assigning the objects to $logObj but then $logObj is never outputted from it, hence producing no output.

Your $logData array is defined but never used, leaving aside is not needed at all in this case. Your function should, ideally, take the arguments for the Access Rules and Path, see Functions with Parameters to learn more.

Format-Table as well as the other Format-* cmdlets should be primarily used for console display, should not be used for exporting data. In this case you should use Export-Csv, this way your data preserves its structure and can be imported back at ease, be filtered and be sorted.

huangapple
  • 本文由 发表于 2023年2月19日 03:24:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/75495837.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定