Powershell脚本-脚本-如何禁用它

p8ekf7hl  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(137)

我有Powershell脚本。在调度程序中,我运行 bat 文件,它运行PS1文件。
BAT文件

Powershell.exe -executionpolicy remotesigned -File script.PS1

PS1文件

$path = "D:\data";
$limit = (Get-Date).AddHours(-3);
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force;

在同一个目录中,powershell会创建YYYYMMDD格式的目录,其中包含文件PowerShell_transcript.SERVER.t7eh07Gy.20230914031500.txt。下面是整个脚本运行。
举例来说:D:\data\20230914\PowerShell_transcript.SERVER.t7eh07Gy.20230914031500.txt等
如何禁用它?
我试过停止转录,等等。
我需要停止记录。

vohkndzv

vohkndzv1#

转录的开始可以由组策略确定,并独立于脚本执行。查看政策示例:

HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription

如果此键中有一个EnableTranscripting值,并且它不等于零,则转录被启用。

zzwlnbp8

zzwlnbp82#

Re1ter's helpful answer提供了关键指针;让我补充一些背景资料

  • 您看到的是启用Turn on PowerShell Transcription策略(组策略[对象])的效果,这会导致所有PowerShell会话(无论是否交互)的 * 自动传输 *,就好像您在每个会话的开始和结束时调用了Start-TranscriptStop-Transcript)。
  • 如果启用此策略:
  • 成绩单存储在特定于节日的目录中,使用名称格式yyyMMdd,例如。20230918 9月18日2023,在使用名称格式PowerShell_transcript.*.*.*.txt的文件中,其中*组件按顺序表示以下内容:
  • 计算机名称(例如,server1
  • 8个字母数字字符的随机串(例如,IjrFVsl1
  • 可排序的本地时间戳;在会话开始时相当于[datetime]::Now.ToString('s') -replace '\D'(例如,``)
  • 范例:
  • PowerShell_transcript.server1.IjrFVsl1.20230918162121.txt
  • 默认情况下,特定于节日的目录存储在用户的Documents目录中(通常为$HOME\Documents;使用[System.Environment]::GetFolderPath('MyDocuments')确定),但位置是可配置的。
  • 策略设置存储在注册表中,可以在注册表中进行 * 查询 *,但不应该在注册表中进行 * 修改 *(从技术上讲,您只能作为管理员进行修改):注册表修改不与原始GPO同步,并且在域环境中,甚至可能在每次重新引导/登录时被覆盖。
  • 相反,应该通过gpedit.msc GUI或GroupPolicy PowerShell模块中的小工具来管理策略。
  • 策略可以在 machine 级别定义,存储在HKEY_LOCAL_MACHINEHKLM:)注册表配置单元中,也可以在 user 级别定义,存储在每个用户的HKEY_CURRENT_USERHKCU:)注册表配置单元中。
  • 如果在 both 级别上定义策略(这是没有意义的),则计算机级别的策略优先。
  • PowerShell (Core) 7+具有与 *Windows PowerShell**不同的 * 策略,尽管可以将其配置为委托给后者的策略。

下面的**Get-AutomaticTranscriptionSettings便捷函数**(源代码在底部)直接查询注册表,以便报告有效的策略设置,因此不需要GroupPolicy模块,而GroupPolicy模块需要安装RSAT工具。
样品调用:

PS> Get-AutomaticTranscriptionSettings

Enabled                     : True
OutputPathPattern           : C:\Users\jdoe\Documents\2*\PowerShell_transcript.*.*.*.txt
IncludeInvocationHeaders    : False
PSEdition                   : Core
UsesWindowsPowerShellPolicy : True
GPOScope                    : Machine
RegistryKey                 : {HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\PowerShellCore\Transcription, HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription}

上面显示了在计算机级别上启用的PowerShell(核心)策略,该策略委托给Windows PowerShell策略(在同一级别上)
请注意,OutputPathPattern属性值可以直接传递给Get-ChildItem,以列出所有现有的转录本。

Get-AutomaticTranscriptionSettings源代码

function Get-AutomaticTranscriptionSettings {
  <#
.SYNOPSIS
  Reports the current automatic transcription settings for PowerShell, if any.
.DESCRIPTION
  Targets the edition that is running the script by default, but you change
  that with -Edition, which accepts 'Core' or 'Desktop' (Windows PowerShell)

  If transcribing is enabled, the .OutputPathPattern property of the output 
  object can be passed to Get-ChildItem -Path to find all current transcripts.

  Note that transcripts are stored in calendar-day-specific subfolders using the
  "yyyDDmm" format, with the transcripts file names matching pattern
  "PowerShell_transcript.*.*.*.txt"
#>

  [CmdletBinding()]
  param(
    [ValidateSet('Core', 'Desktop')]
    [Alias('PSEdition')]
    [string] $Edition
  )

  if ($env:OS -ne 'Windows_NT') { throw 'This command runs on Window only.' }

  Set-StrictMode -Version 1

  if (-not $Edition) {
    # Default to the running edition.
    $Edition = ('Desktop', 'Core')[$PSVersionTable.PSEdition -eq 'Core']
  }
  # Normalize the casing
  $Edition = [char]::ToUpperInvariant($Edition[0]) + $Edition.Substring(1).ToLowerInvariant()

  $regKeys = [ordered] @{
    Desktop = [ordered] @{
      HKLM = Get-Item -ErrorAction Ignore -LiteralPath 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription'
      HKCU = Get-Item -ErrorAction Ignore -LiteralPath 'HKCU:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription'
    }
    Core    = [ordered] @{
      HKLM = Get-Item -ErrorAction Ignore -LiteralPath 'HKLM:\SOFTWARE\Policies\Microsoft\PowerShellCore\Transcription'
      HKCU = Get-Item -ErrorAction Ignore -LiteralPath 'HKCU:\SOFTWARE\Policies\Microsoft\PowerShellCore\Transcription'
    }    
  }

  $effectiveValue = $null # The *absence* of the value is the same as 0
  $effectiveKey = $originalKey = $null
  $usesWinPSPolicy = $false
  foreach ($hive in 'HKLM', 'HKCU') {
    if ($null -ne ($key = $regKeys.$Edition.$hive) -and $null -ne ($value = $key.GetValue('EnableTranscripting'))) {
      if ($Edition -eq 'Core' -and 1 -eq $key.GetValue('UseWindowsPowerShellPolicySetting')) {        
        $usesWinPSPolicy = $true
        $originalKey = $key
        # Use the WinPS settings in the *same hive*
        $key = $regKeys.Desktop.$hive
        $value = if ($null -ne $key) { $key.GetValue('EnableTranscripting') }
      }
      $effectiveKey = $key
      $effectiveValue = $value
      break
    }
  }

  # Construct the output object.
  # Note that the `$(...)` enclosure around the `if` statement is needed for WinPS-compatibility.
  [pscustomobject] @{      
    Enabled                     = 1 -eq $effectiveValue # only 1, specifically, is recognized as the enabling number.
    OutputPathPattern           = $(if ($effectiveKey) { 
        $dir = $effectiveKey.GetValue('OutputDirectory')
        if (-not $dir) { $dir = [System.Environment]::GetFolderPath('MyDocuments') }
        # Output dirs are calendar-day specific "yyyyMMdd" dirs., inside of which each session
        # is transcribed in a "PowerShell_transcript.*.*.*.txt" file.
        Join-Path $dir 2*\PowerShell_transcript.*.*.*.txt
      })
    IncludeInvocationHeaders    = $(if ($effectiveKey) { 1 -eq $effectiveKey.GetValue('EnableInvocationHeader') })
    PSEdition                   = $Edition
    UsesWindowsPowerShellPolicy = $(if ($null -ne $effectiveValue) { if ($Edition -eq 'Desktop') { $true } else { $usesWinPSPolicy } })
    GPOScope                    = $(if ($effectiveKey) { ('User', 'Machine')[$effectiveKey -like 'HKEY_LOCAL_MACHINE\*'] })
    RegistryKey                 = $(if ($usesWinPSPolicy -and $originalKey) { $originalKey.ToString() } if ($effectiveKey) { $effectiveKey.ToString() })
  }

}

相关问题