如果另一个用户运行相同的批处理文件,RunAs /savecred 会要求输入密码

如果另一个用户运行相同的批处理文件,RunAs /savecred 会要求输入密码

我有一个使用过的脚本runas /savecred。第一次它要求我输入密码。后来它没有要求我输入密码,并且运行正常。但如果另一个用户登录到同一台服务器并运行相同的脚本,它会要求他输入密码。

我如何才能让启动该批处理文件的任何用户都存储密码。

我已检查“开始”>“运行”>“control userpasswords2”>“高级”>“管理密码”。只有当我登录时,它才会显示存储的用户名。我们如何在同一台机器上为所有人存储相同的用户名和密码?

答案1

简短的回答是:不要这样做. 你只会向一个巨大的,我的意思是巨大的系统安全漏洞:一旦你/savecred,你就会将管理员密码保存到用户配置文件中,无条件,以便他们可以随时随地以任何方式使用。这意味着,一旦保存,他们可以启动控制台窗口(CMD 提示符),输入“runas /savecred /用户:管理员 cmd.exe“并立即启动一个具有完全管理员权限的新命令控制台来执行任何他们想做的事情。你可能会这样做不是希望他们能够做到这一点!

我认为您真正想要的是允许任何用户运行特定命令,而无需要求提升(管理员)权限或输入管理员密码。为此,现代 Microsoft(t) Windows 操作系统中有一个安全有效的解决方案:将程序设置为作为计划任务运行,并赋予程序所需的特定访问权限。您可以专门为此程序创建一个用户帐户,或者您可能只为此使用管理员/系统凭据,只有这个,程序。方法如下。

首先,您需要设置一个计划任务,就像任何其他计划任务一样。您必须为其分配一个特定的命令行(因此,如果您需要将参数传递给任务,则必须使用脚本或批处理文件来创建“参数文件”以将参数传递给程序,或者使用其他方法来执行此操作。此解决方案并不完美!)。然后,您可以为其分配所需的任何安全权限。为其命名一个合适的名称 - 并避免在名称中使用空格以保持简单;我们将使用此名称在用户需要运行程序时实际运行该程序。此外,不要安排实际的时间来运行任务,因为我们将在稍后按需调用它,而不是始终在特定时间运行。

一旦创建了任务,下一个问题就是“我该如何跑步可以吗?”那么,您可以创建一个快捷方式或批处理/脚本文件,它将调用计划的任务来运行:“schtasks /运行/tn你给上述任务命名“。因此,如果您创建了一个名为“AutoAddLocalPrinters”的任务(例如,一个常见的管理任务),则需要创建一个批处理文件或快捷方式来运行该命令”schtasks /run /tn 自动添加本地打印机“(如果你确实用空格命名,那么你必须把整个姓名用引号引起来——这就是我避免在名称中使用空格的原因)。

请注意,只有在设置计划任务时才需要管理员权限或密码。设置完成后,只需运行任务即可,不需要密码,最重要的是,不会盲目地将管理员密码全局保存到用户配置文件中。它作为计划任务的一部分保存,这只会影响这一点,只有这个任务,并且不会让用户修改或更改它,或者用它启动新的提升的控制台提示符等。

此外,您可以调整计划任务的权限,以仅允许某些用户组运行它,等等。您可以通过创建特殊用户帐户或批处理/脚本文件来进一步微调它,您可以使用这些文件检查和验证您想要的任何条件的权限。例如,如果您有孩子,您可以创建一个脚本,在允许他们启动聊天程序之前检查是否过了他们的睡觉时间。;-) 简而言之,您几乎可以做任何您想做或需要做的事情来验证和控制程序的运行方式(或拒绝)。

最后,这样做还有一个优点(或缺点...):它适用于几乎所有可以安排任务并运行“schtasks”命令的 Windows 版本。例如,我的理解是 Windows 家庭版无论如何都会忽略“runas”的 /savecred 选项,因此您始终必须提供密码。计划任务将使用您设置的凭据运行,即使在家庭版中也是如此。

脚注:我提到这一点是因为我通常会从系统 PATH 变量中删除许多程序路径,并将“C:\sys\admin;C:\sys\bat;C:\sys\bin”添加到系统路径。然后在“C:\sys*”文件夹下(显然,您需要创建它们),我创建单独的批处理/脚本/快捷方式文件,这些文件调用实际程序或计划任务。这样,我就可以完全控制允许/禁止运行各种程序的人员、内容、时间、地点和方式。它还有助于防止出现愚蠢的错误——我实际上遇到的一个错误是我的一个最终用户试图转换文件并运行“转换”命令,而不知道他们在做什么。由于 Windows 已经有一个“转换”命令,可以将 FAT 转换为 NTFS,他们所做的就是转换他们的文件系统。他们很幸运,它仍然有效,因为他们的计算机并不关心文件系统是 FAT 还是 NTFS。但是现在我总是有一个 C:\sys\bat\convert.bat 文件,它会拍拍他们的手并告诉他们在尝试运行此命令之前先与我交谈.. ;-) 我对许多其他潜在危险或高级用户命令也做同样的事情,这些命令在误用/错误输入时可能会导致严重问题。

祝你好运!

于 2020-09-18 编辑并添加:

  1. 作为管理员(即使是在个人/家用计算机环境中,而不仅仅是专业管理员),请养成始终保护文件系统和文件的习惯。除非在上下文中确实有意义,否则不要向用户授予读取、写入、执行或其他类型的权限。我强烈建议不要仅仅因为这可能会减少管理麻烦而授予额外的访问权限——无论是善意的还是恶意的误用所造成的麻烦远远超过了首先为保护系统安全而做的额外工作。我个人甚至为自己设置并使用了两个用户帐户,一个管理员帐户和一个“普通用户”帐户,用于日常和常规使用。尽管在它们之间切换很麻烦,但它让我避免了更严重的问题,当其他人试图“入侵”我管理的系统时,包括(但不限于)键盘记录器、木马、病毒,甚至我的侄子只是天真地试图设置一个游戏服务器来与“朋友”玩游戏——而那个“朋友”试图利用游戏服务器漏洞来访问他的系统。
  2. 我没有检查我的原始帖子以更新其适用于 Windows XP/2003/7 之后的 Windows (tm) 版本,因为 Microsoft (tm) 不再支持这些版本。我在 2016 年左右切换到基于 Linux 的操作系统,并且不再“了解”基于 Microsoft Windows 的系统的问题,因此无法进一步验证。

答案2

脚本可以作为任务运行,但如果我们必须以另一个用户的身份运行交互式应用程序,则创建任务不起作用。您必须勾选“无论用户是否登录都运行”框,如果这样做,任务将不会显示应用程序的用户界面。不知道是否有解决方案。

答案3

如果程序必须是交互式的,那么没有 /savecred 选项就没有简单的方法可以以更高的权限运行程序。

使用计划任务时,界面不会显示给实际用户,因此无法进行交互。

我发现实现我的目的的唯一方法是创建一个小型 vb 程序,启动 runas 命令(不带 /savecred 选项),然后通过 Windows API SendMessage 将密码发送到 Dos 窗口。

用户和密码存储在 Windows 注册表中,密码使用 Blowfish 算法加密(在我的情况下,但每个人都可以选择不同的方式)。

然后,我只需在需要时启动该程序(在我的情况下是在登录期间)。

我不知道如何附加源代码,无论如何这是主要部分:

宣言:

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal 
lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetSystemDirectory Lib "kernel32" Alias 
"GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As 
Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" 
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As 
Any) As Long

Private Const WM_CHAR = &H102
Private WshShell 

身体:

' Used in a Subroutine
If Not IsRunning("runas.exe") Then

                        Set WshShell = CreateObject("WScript.Shell")
                        Set WshEnv = WshShell.Environment("Process")

                        rc = WshShell.Run("runas /user:" & sUser & " notepad.exe", 2, False)
                        Sleep 400

           End If
                       SendPass    

函数 isRunning 检查是否已有一个活动的 runas 窗口:

Private Function IsRunning(ByVal proc As String) As Boolean

Dim oProcs As Object
Set oProcs = GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process 
WHERE Name='" & proc & "'")
IsRunning = (oProcs.Count > 0)
Set oProcs = Nothing
End Function    

还有函数 SendPass,将密码发送给 runas 命令:

Public Function SendPass()
Dim winHwnd As Long
Dim sSave As String, Ret As Long
Dim intConta As Integer
Dim bytBuffer() As Byte
sSave = Space(255)
Ret = GetSystemDirectory(sSave, 255)

sSave = Left$(sSave, Ret)
winHwnd = FindWindow(vbNullString, sSave & "\runas.exe")

If winHwnd <> 0 Then

    bytBuffer = StrConv(sPass & vbNullChar, vbFromUnicode)


    For intConta = 0 To UBound(bytBuffer, 1) - 2
       Call SendMessage(winHwnd, WM_CHAR, bytBuffer(intConta), ByVal 0&)
    Next intConta
End If
End Function

答案4

该文件存储在: %appdata%\Microsoft\Credentials 将会创建一个隐藏的系统文件,您可以使用十六进制编辑器正确打开它来读取其内容。

相关内容