gpt4 book ai didi

powershell - 无法使用 PowerShell 从远程服务器访问环境变量

转载 作者:行者123 更新时间:2023-12-03 23:43:40 25 4
gpt4 key购买 nike

我有一个脚本来查询远程 Windows 服务器列表以检索我创建的环境变量的值。

我可以看到变量确实存在,因为我在打印所有变量时可以看到它:$EnvObj :

try 
{
$Name="MY_VAR"
$VerbosePreference="Continue"

# Read a list of server names
$file = New-Object System.IO.StreamReader -Arg "C:\Users\foo\Documents\test.txt"

while ($Computer = $file.ReadLine())
{
if(!(Test-Connection -ComputerName $Computer -Count 1 -quiet))
{
Write-Verbose "$Computer is not online"
Continue
}

try
{
$EnvObj = @(Get-WMIObject -Class Win32_Environment -ComputerName $Computer -EA Stop)
if(!$EnvObj)
{
Write-Verbose "$Computer returned empty list of environment variables"
Continue
}

if($Name)
{
Write-Verbose "Looking for environment variable with the name $name"
$Env = $EnvObj | Where-Object {$_.Name -eq $Name}

# None of these work but printing $EnvObj shows that $Name ("MY_VAR") is there:
$res=[environment]::GetEnvironmentVariable($Name, "Process")
$res1=[environment]::GetEnvironmentVariable($Name, "User")
$res2=[environment]::GetEnvironmentVariable($Name, "Machine")
$res4=$Env:Name

if(!$Env)
{
Write-Verbose "$Computer has no environment variable with name $Name"
Continue
}
}
else
{
Write-Verbose "No environment variable specified. Listing all"
$EnvObj # shows that the requested environment variable is present
}
}
catch
{
Write-Verbose "Error occurred while querying $Computer. $_"
Continue
}
}
}
finally
{
$file.close()
}

变量本身归 <SYSTEM> 所有:
VariableValue    Name    UserName                                                
------------- ---- --------
1234 MY_VAR <SYSTEM>

但是当我尝试使用任何可能的枚举检索它时,它什么也不返回:

这些都不起作用,只能打印 $EnvObj显示 $Name ("MY_VAR")在那儿:
# .Net way
$res=[environment]::GetEnvironmentVariable($Name, "Process")
$res1=[environment]::GetEnvironmentVariable($Name, "User")
$res2=[environment]::GetEnvironmentVariable($Name, "Machine")

# PS Way
$res4=$Env:Name

...即使我打印 $EnvObj对象我可以看到 $Name肯定在那里。

怎么了?

最佳答案

你的线路

$EnvObj = @(Get-WMIObject -Class Win32_Environment -ComputerName $Computer -EA Stop) 

将返回一个数组 [ManagementObject] .

要检查所有属性,您可以通过管道将这些对象之一发送到 Get-Member
$EnvObj[0] | Get-Member

TypeName: System.Management.ManagementObject#root\cimv2\Win32_Environment

Name MemberType Definition
---- ---------- ----------
PSComputerName AliasProperty PSComputerName = __SERVER
Caption Property string Caption {get;set;}
Description Property string Description {get;set;}
InstallDate Property string InstallDate {get;set;}
Name Property string Name {get;set;}
Status Property string Status {get;set;}
SystemVariable Property bool SystemVariable {get;set;}
UserName Property string UserName {get;set;}
VariableValue Property string VariableValue {get;set;}
__CLASS Property string __CLASS {get;set;}
__DERIVATION Property string[] __DERIVATION {get;set;}
__DYNASTY Property string __DYNASTY {get;set;}
__GENUS Property int __GENUS {get;set;}
__NAMESPACE Property string __NAMESPACE {get;set;}
__PATH Property string __PATH {get;set;}
__PROPERTY_COUNT Property int __PROPERTY_COUNT {get;set;}
__RELPATH Property string __RELPATH {get;set;}
__SERVER Property string __SERVER {get;set;}
__SUPERCLASS Property string __SUPERCLASS {get;set;}
PSStatus PropertySet PSStatus {Status, Name, SystemVariable}
ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime ScriptMethod System.Object ConvertToDateTime();

从中你可以看到 value 属性被称为 VariableValue .

所以,
$EnvLookup = $EnvObj | Where-Object {$_.Name -eq $Name}
$res = $EnvLookup.VariableValue

关于powershell - 无法使用 PowerShell 从远程服务器访问环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31845488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com