如何使用 Windows 任务计划程序安全地存储每天运行的脚本的密码?

2023-12-25

我编写了一个PowerShell脚本来执行一些操作。操作完成后,我希望脚本使用以下命令发送邮件Send-MailMessage cmdlet.

为此,我使用了谷歌的应用程序密码功能。但我对将应用程序密码以纯文本形式存储在脚本本身中没有信心。我可以以某种方式加密并将其存储在脚本或单独的文件中,但人们仍然可以看到该密码。即使我加密密码,解密登录名也会存在于脚本本身中。我认为有用的另一种方法是将加密密码作为环境变量传递,但是 1.我找不到如何做到这一点,2.我仍然认为这不安全,因为人们可以检查环境变量。

有更好的方法来实现这一目标吗?


处理凭据的一般方法是避免使用它们,而是依赖其他方式进行身份验证,例如证书或 Windows 身份验证。 https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md

正如您显然自己发现的那样,尝试编写一个单因素身份验证 https://en.wikipedia.org/wiki/Authentication要么最终以catch-22 https://en.wikipedia.org/wiki/Catch-22_(logic)或者不安全,因为无论您使用脚本隐藏多深,有权访问您的脚本的每个人都可以访问密钥通过默默无闻实现安全 https://en.wikipedia.org/wiki/Security_through_obscurity.

如果您无法更改应用程序的身份验证方式,最安全的实用方法可能是创建您自己的“单点登录 https://en.wikipedia.org/wiki/Single_sign-on” 在使用 Windows 的方式DPAPI(数据保护API) https://en.wikipedia.org/wiki/Single_sign-on其中加密基于计算机和用户凭据。

为此,您可以使用 PowerShell转换为安全字符串 https://learn.microsoft.com/powershell/module/microsoft.powershell.security/convertto-securestring and ConvertFrom-SecureString https://learn.microsoft.com/powershell/module/microsoft.powershell.security/convertfrom-securestringcmdlet。
首先创建一个安全字符串(在相关计算机/用户帐户下):

Read-Host 'Enter your password' -AsSecureString | ConvertFrom-SecureString

这将返回一个类似的字符串:

01000000d08c9ddf0115d1118c7a00c04fc297eb01000000da4b9d0c09bdb140b3060606f3557e1200000000020000000000106600000001000020000000319f97dca4698fd8848b183e0a7e3fa26127043f68b75ed0ffad6e60eee59201000000000e8000000002000020000000e7f6f6c563f442ef7563967ab907abd528147e1cb8d03efdb4892f29ecbe38d3100000003098dedec04172048148654f5846bbcd40000000d270797bc32ba3d42a217d26dc1395b4bbf4fb4a9f9fe701b98270e1db848de3b048c36a792061fea06e1123b0288d687ffdda2ae934f63f60d58a8c19631007

⚠️警告
SecureString 的内容在非 Windows 系统上未加密。

您可以将此字符串放入环境变量或其他位置,甚至简单地将其嵌入到脚本中:

$EncryptedPassword = '01000000d08c9ddf...

请注意,此字符串只能在特定计算机上由创建该字符串的用户帐户解密$EncryptePassword。这个限制实际上增加了安全性(也知道每次你使用ConvertFrom-SecureString命令你会得到一个不同的字符串)。

要在脚本中显示纯文本密码,您可以执行以下操作:

$Password = $EncryptedPassword | ConvertTo-SecureString | ConvertFrom-SecureString -AsPlainText

请注意,您实际上应该尽量避免使用上述命令,因为这会泄露密码并可能留下内存痕迹。因此,至少删除解密的变量是一件好事,例如:Remove-Variable Password.

加密您的脚本

您甚至可以考虑使用 DPAPI 加密您的整个脚本,包括硬编码的纯密码(这实际上比使用工具更好地保护它)PS2EXE):

  • Protect-Script.ps1
param(
    [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
    [string] $Path,
    [switch] $AsBase64
)
$Item = Get-Item $Path
if ($Item) {
    $OutPath = "$($Item.DirectoryName)\$($Item.BaseName).Protected$($Item.Extension)"
    $ScriptBlock = Get-Content -Raw -Path $Path
    $Hex = $ScriptBlock | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString
    if ($AsBase64) {
        $Bytes = [byte[]] -split ($Hex -replace '..', '0x$& ')
        $Base64 = [Convert]::ToBase64String($Bytes)
        Set-Content -Path $OutPath "`$Base64 = '$Base64'"
        Add-Content -Path $OutPath '$Bytes = [System.Convert]::FromBase64String($Base64)'
        Add-Content -Path $OutPath '$Hex = -Join $Bytes.Foreach{ $_.ToString("x2") }'
    }
    else {
        Set-Content -Path $OutPath "`$Hex = '$Hex'"
    }
    Add-Content -Path $OutPath '$ScriptBlock = $Hex | ConvertTo-SecureString | ConvertFrom-SecureString -AsPlainText'
    Add-Content -Path $OutPath 'Invoke-Expression $ScriptBlock'
    Add-Content -Path $OutPath 'Remove-Variable Base64, Bytes, Hex, ScriptBlock -ErrorAction SilentlyContinue'
}

Usage:

.\Protect-Script.ps1 .\MailMessage.ps1 -AsBase64

.\MailMessage.Protected.ps1

再次:.\MailMessage.Encrypted.ps1脚本仅适用于创建该脚本的计算机和帐户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Windows 任务计划程序安全地存储每天运行的脚本的密码? 的相关文章

  • SQL Server:删除除系统数据库之外的所有数据库

    在 PowerShell 中 我使用以下代码删除所有非系统 SQL Server 数据库 invoke sqlcmd ServerInstance sqlInstanceName U sqlUser P sqlPass Query EXEC
  • 相当于 UNIX diff 和 patch 的本机 PowerShell

    我需要潜在地修补文件作为脚本的一部分 为了使脚本所做的事情更具可读性 我想以类似于 UNIX diff 和 patch 方法的方式来实现它 在标准 UNIX 系统上 diff 可以生成特殊格式的文本文件 表示两个文件之间的差异 这可以与要修
  • 如何获取管道对象的数量?我不想累积管道来缓冲

    假设我有一些 powershell 代码 function count pipe CmdletBinding param Parameter ValueFromPipeline true object inputObject process
  • Powershell DSC Pull 服务器引发内部错误 - Microsoft.Isam.Esent.Interop 未找到

    我已按照 Powershell org 中的说明进行操作DSC Book http powershell org wp ebooks 设置 http Pull 服务器 Windows 2012 服务器 以与 DSC 一起使用 我设置了 ht
  • 使用 powershell 编辑 XML

    好吧 我感觉自己像个大白痴 为了工作中的管理目的 我使用 Powershell 已经有一段时间了 也就是说 编写脚本不是我的强项 现在 我正在尝试编写一个 PS 脚本 将一个部分添加到一堆机器上的 XML 中 以添加设置来解决我们在某个应用
  • PowerShell 脚本 ffmpeg

    作为一名优秀的 Windows 系统管理员 我终于开始学习 PowerShell 话虽这么说 我不知道我在做什么 惊讶 惊讶 我认为远离生产环境 在家里使用 PowerShell 对我来说将是一次很好的学习经历 最近 我开始使用 FFMPE
  • 抑制数组列表添加方法管道输出

    我正在使用数组列表来构建日志项序列以供稍后记录 工作起来很不错 但是 Add 方法将当前索引发送到管道 我可以通过将其发送到 null 来解决这个问题 如下所示 strings Add junk gt null 但我想知道是否有某种机制可以
  • Powershell v5.1 Invoke-RestMethod 并绕过代理

    我目前使用的是 Powershell V5 1 并且希望在 Invoke RestMethod 命令上绕过 Internet Explorer 代理 在 Powershell V6 中 有 NoProxy 选项 指示 cmdlet 将不使用
  • 如何使用 P/Invoke 在 PowerShell 1.0 中调用 Win32 函数?

    在许多情况下 从 PowerShell 脚本调用 Win32 函数或其他一些 DLL 会很有用 给定以下函数签名 bool MyFunction char buffer int bufferSize 我听说 PowerShell CTP 2
  • 在Powershell中传递引用类型参数

    function test1 param System Collections ArrayList x x Add Test1Add write in Test1 x x New Object System Collections Arra
  • 具有多个范围的 Powershell 整数参数验证

    我知道您可以声明一个仅接受特定范围内的值的整数参数 Parameter ValidateRange 1024 66535 Port 是否可以验证多个范围的参数输入 例如 假设我希望允许端口输入为 1 到 80 135 到 445 以及 10
  • 修改 xml 同时保留空格

    我在尝试替换 XML 文件中的属性同时保留空格时遇到了几个问题 尝试1 xml xml get content data xml xml Path To Attribute value set content data xml String
  • 获取在特定日期之后修改的一组文件

    有没有人有一个方便的 powershell 脚本根据修改日期从 TFS 获取一组文件 我想说 给我这个文件夹 或子文件夹 中在 X Y ZZZZ 之后修改的所有文件 并将这些文件转储到它们通常所在的文件夹之外的文件夹中 我知道足够的 pow
  • 如何在 Azure PowerShell 函数中导入模块?

    我尝试从函数查询天蓝色表 使用 Get AzTableRow 在我的笔记本电脑上工作得很好 但模块 aztable 不存在于天蓝色功能中 因此我得到的只是红屏 有办法安装吗 谢谢 大卫 您无需自行在 Azure Function 中安装 A
  • 使用 init.ps1 和 nuget 将文件复制到解决方案文件夹

    我在使用 nuget 包的 init ps1 中的 ps 脚本时遇到问题 我试图在安装包时创建一个解决方案文件夹 然后将 dll pdbs 复制到此文件夹 并删除项目中包安装的源 dll pdbs 我能够创建解决方案文件夹 但将文件从 co
  • EWS - 访问共享日历项目/约会

    我正在尝试获取共享日历的所有项目 我已关注EWS 访问所有共享日历 https stackoverflow com questions 23766747 ews access all shared calendars 23773834 23
  • 使用 PEM 证书验证 Powershell 中的 XML 签名

    我正在尝试创建一个 powershell 脚本来使用 XML 文档中的数据 然而 在进行任何工作之前 我需要通过验证签名来验证 XML 没有被篡改 我有一份用于以 PEM 格式签署 XML 的证书的公钥副本 但我不知道如何让 powersh
  • 如何使用PowerShell批量调用Update-Database

    我们使用 Azure 弹性池生成多个客户端数据库和一个引用客户端数据库的主数据库 我们已经拥有多个数据库 并且正在开发新版本的代码 我们使用 EF6 代码优先 当我们更改模型 添加属性 时 我们创建迁移文件并需要调用Update Datab
  • 查询计算机列表 - 输出上次登录用户和上次登录日期

    我正在创建一个脚本来从 txt 文件中检索所有计算机名称 然后对它们进行查询 计算机名 用户名 最后登录计算机的用户名 上次登录 使用的日期 这就是我所拥有的 Clear Host machines Get Content Path C U
  • 在 PowerShell 中提取 EXIF 数据的简单方法?

    我一直在研究使用 PowerShell 提取 EXIF 数据的各种方法 但到目前为止我发现它相当复杂 一些here http blog cincura net 233463 renaming files based on exif data

随机推荐

  • 如何将键值元组数组转换为对象

    我有一个数组 cardType iDEBIT txnAmount 17 64 txnId 20181 txnType Purchase txnDate 2015 08 13 21 50 04 respCode 0 isoCode 0 aut
  • 在 Asp.net Identity MVC 5 中创建角色

    关于使用新的 Asp net 身份安全框架的文档非常少 我已经拼凑了我可以尝试创建一个新角色并向其中添加一个用户的内容 我尝试了以下方法 在 ASP NET Identity 中添加角色 https stackoverflow com qu
  • 使用 new Image() 时 JavaScript 中的内存泄漏

    我似乎有内存泄漏 是由于在 javascript 脚本中使用 new Image 引起的 如果我在 Windows 资源监视器中查看已使用的物理内存 我会在加载页面时获得预期的内存使用量增加 因为它使用以下方式加载一些相当大的图像 var
  • htaccess 重写 URL 不适用于 codeigniter 代码

    我正在尝试重写 URLS 以便 foo gt index php index php 由 codeigniter 3 提供支持 bar php 是一个独立的 php 文件 这是我的 htaccess 中的片段 Test 1 Bar php
  • 如何完美同步两个或多个html5视频标签?

    有没有办法让两个或更多 最好是三个 html5标签同时播放并完美同步 如果我有一个视频的三个图块 我希望它们作为一个大视频出现在浏览器中 他们需要成为完美同步 甚至没有最小的视觉 垂直提示表明它们是平铺的 不幸的是我无法使用 MediaCo
  • 有没有办法检查 NumPy 数组是否共享相同的数据?

    我的印象是 在 NumPy 中 两个数组可以共享相同的内存 举个例子 import numpy as np a np arange 27 b a reshape 3 3 3 a 0 5000 print b 0 0 0 5000 Some
  • 运行 Quartz.NET 嵌入式或作为 Windows 服务的优缺点

    我想将quartz调度添加到ASP NET应用程序中 它将用于发送排队的电子邮件 将quartz net 作为 Windows 服务运行与嵌入式相比有何优缺点 我主要关心的是嵌入模式下的 Quartz NET 如何处理 IIS 中可变数量的
  • VSCode - 保存时禁用所有自动格式化

    我正在编辑别人的代码 我只想更改 9000 行文件中的 1 行 但每次保存时 VS Code 都会格式化整个文件并删除所有尾随空格 这是一个禁忌 因为当我把它推上去时 审阅者将不知道该看哪一行 我尝试禁用 prettier 将所有文件添加到
  • iPhone + Drupal + JSON RPC 服务器问题

    我不知道如何使用 Obj C 发布 JSON RPC 请求 谁能帮我 到目前为止我有 responseData NSMutableData data retain NSMutableURLRequest request NSMutableU
  • 使用 getNodeSet 解析 XML - 识别缺失的标签

    我正在解析 XML 文件getNodeSet 假设我有一个来自书店的 XML 文件 其中列出了 4 本书 但其中一本书缺少 作者 标签 如果我使用以下方法解析 XML 中的标签 authors data nodes 2 lt getNode
  • android edittext的最小值和最大值

    我正在开发一个android应用程序 实际上我需要为编辑文本条目设置最小值和最大值我的最小值是18 最大值是65 我做了这个的确切代码 package com test import android text InputFilter imp
  • CSS 按钮在 Google Chrome 中不起作用?

    我正在为一家电影公司的网站制作一个主页 它有一个带有悬停效果的 CSS 按钮 一旦准备好就会打开一个灯箱 目前我只是将其设置为 href 作为一个占位符 直到我准备好实现灯箱 还有一个向下箭头的小图像 链接设置为尚未出现在页面上的锚点 这两
  • ios7 UIWebView Youtube 视频

    我有一个 UIWebView 子类 用来播放 youtube 和本地视频 在iOS6下完美运行 在升级到 iOS7 的过程中 我遇到了一个问题 我真的不知道从哪里开始 虽然子类似乎仍然可以在 iOS7 模拟器上播放 youtube 和本地视
  • 在通用方法中将值转换为 T

    我有一个破旧的属性映射的界面 interface IPropertyMap bool Exists string key int GetInt string key string GetString string key etc 我想创建一
  • 有没有办法检测 Facebook Javascript SDK 是否加载成功?

    我使用 Facebook 作为我网站的会员系统 它使用代码生成登录控件 允许用户通过 Facebook 帐户登录 如果他们已经是会员 则基本上只需单击一下 如果不是会员 则只需单击 2 次 用于授予权限 但我遇到了问题 反馈表明登录按钮并不
  • 在 Eclipse IDE 中恢复已删除的文件

    两天前 我在 Eclipse IDE 中删除了五个 Java 文件 现在我需要它们 我试图从当地历史中恢复它们 我只恢复了其中两个 当我右键单击其他文件 然后单击从本地历史记录恢复时 收到错误消息No additional members
  • 处理大文件的最佳 Python Zip 模块是什么?

    编辑 特别是压缩和提取速度 有什么建议么 Thanks 所以我制作了一个随机的大压缩文件 ls l zip rw r r 1 aleax 5000 115749854 Nov 18 19 16 large zip unzip l large
  • ASP.NET MVC 帐户控制器使用指南?

    我正在查看 MVC 帐户控制器 它似乎来自 ASP NET Webforms 有没有关于如何使用它的好的背景信息 您可以将其映射到用户数据库表还是最好进行自己的用户管理 如何在 MVC 中使用它来限制登录用户可以查看的页面 您必须自己完成所
  • 没有可用的缓冲区空间(已达到最大连接?)表单 Postgres EDB 驱动程序

    我们在通过 java 应用程序连接到数据库时遇到异常 堆栈跟踪如下 com edb util PSQLException The connection attempt failed at com edb core v3 Connection
  • 如何使用 Windows 任务计划程序安全地存储每天运行的脚本的密码?

    我编写了一个PowerShell脚本来执行一些操作 操作完成后 我希望脚本使用以下命令发送邮件Send MailMessage cmdlet 为此 我使用了谷歌的应用程序密码功能 但我对将应用程序密码以纯文本形式存储在脚本本身中没有信心 我