从reg查询中修剪输入

时间:2014-01-13 15:40:26

标签: powershell registry

Windows XP机器:

reg query "\\COMPUTER_NAME\HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\WinLogon" /v DefaultUserName

输出:DefaultUserName REG_SZ ajstepanik

Windows 7计算机

reg query "\\COMPUTER_NAME\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" /v LastLoggedOnUser

输出:LastLoggedOnUser REG_SZ GHS_NTDOMAIN\ajstepanik

我想知道是否有可能减少这一点,所以我会留下GHS_NTDOMAIN\ajstepanik ...或者甚至更好,如果我能得到用户名,在这个例子中是ajstepanik

提取名称并存储它的原因是,我可以将其删除并插入其他命令。

编辑其他帮助(win7):

$reg1  = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $tag1)
$key1  = $reg1.OpenSubKey('Microsoft\Windows\CurrentVersion\Authentication\LogonUI')
$user1 = $key1.GetValue('LastLoggedOnUser') -replace '^.*?\\'

echo $user1

返回错误:

You cannot call a method on a null-valued expression.
At C:\Users\ajstepanik\Desktop\test.ps1:30 char:1
+ $user1 = $key1.GetValue('LastLoggedOnUser') -replace '^.*?\\'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

3 个答案:

答案 0 :(得分:2)

我完全删除reg.exe并按如下方式读取远程注册表:

$rhost = 'COMPUTER_NAME'

$reg  = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $rhost)
$key  = $reg.OpenSubKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon')
$user = $key.GetValue('DefaultUserName') -replace '^.*?\\'

这是一种更简洁的方法,因为GetValue已经产生了实际值。在用它做事之前,你不必用其它字符串解析它。

答案 1 :(得分:1)

看起来很简单:

(reg query "\\%tag%\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" /v LastLoggedOnUser).split('\')[1]

它会给你一个字符串。只需将其拆分为反斜杠即可。并采取第二个元素。

答案 2 :(得分:1)

您可以使用Microsoft .NET Framework类型远程查询注册表,并获取对象结果。查看PowerShell的远程注册表模块:http://archive.msdn.microsoft.com/PSRemoteRegistry

话虽这么说,你可以解析上面命令的输出,如下所示:

$Output = reg query "\\%tag%\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" /v LastLoggedOnUser
$Output -join '' -match '\w+\\\w+$';
$matches[0];

如果您想更进一步,可以通过正则表达式“命名组”解析域名和用户名,如下所示:

$output -join '' -match '(?<domain>\w+)\\(?<username>\w+)$';
$matches.username;
$matches.domain;