Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以管理员身份运行PowerShell脚本而不键入密码_Powershell_Uac - Fatal编程技术网

以管理员身份运行PowerShell脚本而不键入密码

以管理员身份运行PowerShell脚本而不键入密码,powershell,uac,Powershell,Uac,我写了一个脚本,通过运行一个批处理文件,就可以在计算机通过Wi-Fi或有线互联网连接之间切换。我写这篇文章是因为我不喜欢每次都必须输入用户名和密码才能在两者之间切换 注意:我必须启用UAC,所以不幸的是,关闭它不是一个选项 它查看无线适配器的状态。如果当前已启用,它将关闭无线适配器并启用有线适配器。如果未启用无线,则将启用和禁用有线。这是代码 $adapter = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPE

我写了一个脚本,通过运行一个批处理文件,就可以在计算机通过Wi-Fi或有线互联网连接之间切换。我写这篇文章是因为我不喜欢每次都必须输入用户名和密码才能在两者之间切换

注意:我必须启用UAC,所以不幸的是,关闭它不是一个选项

它查看无线适配器的状态。如果当前已启用,它将关闭无线适配器并启用有线适配器。如果未启用无线,则将启用和禁用有线。这是代码

$adapter = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Where-Object {$_.ServiceName -ne "hamachi"}
function wirelessOn
{
    $wireless = Get-WmiObject -Class Win32_NetworkAdapter | Where-Object {$_.Name -like "*Wireless*"}
    $wireless.Disable()
    $wired = Get-WmiObject -Class Win32_NetworkAdapter | Where-Object {$_.Name -like "*gigabit*"}
    $wired.Enable()
}

function wirelessOff
{
    $wired = Get-WmiObject -Class Win32_NetworkAdapter | Where-Object {$_.Name -like "*gigabit*"}
    $wired.Disable()
    $wireless = Get-WmiObject -Class Win32_NetworkAdapter | Where-Object {$_.Name -like "*Wireless*"}
    $wireless.Enable()
}

switch -wildcard ($adapter.description){
    "*wireless*" {
        wirelessOn
    }
    "*gigabit*" {
        wirelessOff
    }
}

不幸的是,这个脚本只有在以管理员身份运行时才能正常工作,因此我编写它的全部原因都没有意义。有没有一种方法可以让我在不做任何事情的情况下将此提升为管理员权限?

您可以启动一个新的提升的PowerShell进程来运行您的脚本,例如:

Start-Process PowerShell -verb runas -ArgumentList '-noexit','-File','path-to-script'
如果您不希望PowerShell窗口挂起,那么请去掉
'-noexit'
,但对于调试脚本的启动,它是有用的

如果您有权访问管理员帐户用户名/密码,则可以执行以下操作:

# Capture encrypted password once and store to file
$passwd = Read-Host "Enter password" -AsSecureString
$encpwd = ConvertFrom-SecureString $passwd
$encpwd > $path\password.bin

# Afterwards always use this to start the script
$encpwd = Get-Content $path\password.bin
$passwd = ConvertTo-SecureString $encpwd
$cred = new-object System.Management.Automation.PSCredential 'domain\username',$passwd
Start-Process PowerShell -Cred $cred -ArgumentList '-noexit','-File','path-to-script'   

您可以通过使用批处理(.bat)文件和任务调度器来实现这一点

首先,必须在与PowerShell.ps1文件相同的文件夹中创建一个批处理文件(可以使用记事本),该文件包含以下内容:

@ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%PutTheNameOfYourPowerShellScriptHere.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%PowerShellScriptPath%""' -Verb RunAs}";
打开任务计划程序并单击左窗格上的任务计划程序库。然后,右键单击任务计划程序库并选择创建任务(这将打开一个窗口)。为您的任务指定一个名称,并检查是否选择了以最高权限运行。然后,单击操作选项卡并单击新建(这将打开一个窗口)。验证所选操作是否为启动程序,然后单击浏览以选择批处理文件。在两个窗口上单击确定,您应该回到主任务计划程序窗口。您应该在列表顶部看到新创建的任务,因此右键单击它并选择运行。您应该看到您的PowerShell脚本以完全管理员权限运行,并且没有任何UAC提示

现在,如果您想按常规计划运行PowerShell脚本,您可以通过右键单击新创建的任务、选择属性、单击触发器选项卡并单击新建对其进行自定义

但是,如果您希望通过双击快捷方式文件来运行PowerShell脚本,则必须执行一些附加步骤。右键单击桌面,选择新建>快捷方式,然后输入以下位置:

C:\Windows\System32\schtasks.exe /run /tn "PutTheNameOfYourNewlyCreatedTaskHere"
单击下一步,为快捷方式命名,然后单击完成。您应该尝试打开快捷方式,看看您的PowerShell脚本是否按需要运行

仅此而已

好处:如果要通过按某个键或组合键来运行PowerShell脚本,还可以右键单击快捷方式,并在快捷键:字段中输入所需内容。但是,如果它不允许您输入特定的键或键组合,您也可以安装Microsoft提供的PowerToys,并使用其键盘管理器实用程序重新映射键或键组合。例如您可以在快捷键:字段中输入F8,然后将其重新映射到您很少使用的键,如大多数键盘上的计算器键

如果您在遵循本指南时遇到任何问题,请告诉我


当我这样做时,我仍然会得到UAC,典型的UAC配置是提示“允许”程序运行。当您的用户帐户是管理员的成员,但您使用标准用户令牌运行时,就会发生这种情况。听起来您实际上是在标准用户帐户下运行的?如果是,您知道管理员用户名/密码吗?在这种情况下,可以将凭据传递到Start Process cmdlet。还有一些方法可以安全地将密码存储在DPAPI中,然后在脚本中检索密码,这样就不必提示您提供密码。我没有访问“admin”帐户的权限。如果我输入我的凭证,它实际上是有效的。我怎样才能自动地把我的传进来?@mhopkins321我面临着同样的问题。我没有管理员权限的地方。我尝试使用runas运行我的脚本,但我得到UAC提示来启动powershell。。你是如何绕过它的?实际上,你是在问如何运行一个提升的脚本而不必处理UAC。这完全否定了UAC的全部观点。如果你能做到这一点,这将是UAC的一个严重漏洞,你不这么认为吗?我不这么认为。因为我知道可以通过文本文件或硬编码将凭证传递给UAC。我知道这是可能的,因为我相当确定服务器一直在等待系统管理员登录并单击“是”。此外,我知道这是一个8年前的问题,但无论如何,我想提供帮助。令人惊讶的是,这似乎是我在过去一个小时内发现的唯一可行的选项,而且它不会“泄露”密码。(并使用调度程序进行一次性设置)。我的用例唯一缺少的部分是我需要能够将参数传递给脚本。。。不确定schtasks.exe是否支持它。。。