如何使用 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 任务计划程序安全地存储每天运行的脚本的密码? 的相关文章

随机推荐

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

    我有一个数组 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 为此 我使用了谷歌的应用程序密码功能 但我对将应用程序密码以纯文本形式存储在脚本本身中没有信心 我