try 为我的IT帮助台团队创建一个基本脚本,该脚本查询我们的广告,以查看计算机的主机名是否已在域中.我希望这不需要任何模块,这样它就可以在任何Windows计算机上运行,而无需额外的软件(因此,我使用DirectoryServices).

此外,公司编码策略阻止我预定义凭据,因此我希望将其设置为用户定义的.然而,似乎只有预定义了脚本,脚本才能成功运行.如果凭据是用户定义的,则获取以下错误.

使用"0"参数调用"FindAll"时出现异常:"用户名或密码不正确."

下面是我所拥有内容的修订版本.

$username = read-host 'Enter username' 
$password = read-host 'Enter password' -AsSecureString
$hostname = hostname

Write-Host "Checking if $hostname is on the domain..."
$filter = "(&(ObjectCategory=computer)(Name=$hostname))"
$de = New-Object DirectoryServices.DirectoryEntry("LDAP://contoso.com/DC=contoso,DC=onmicrosoft,DC=com",$username,$password)
$ds = New-Object DirectoryServices.DirectorySearcher $de
$ds.filter = $filter
$ds.findall() |
ForEach-Object -Begin {} -Process{$_.properties.item(“Name”)} -End { [string]$ds.FindAll().Count } | Out-Null
  if ($ds.FindAll().Count)
    {
        Write-Host "true"
    }
  else
    {
        Write-Host "false"
    }

凭证可以由用户定义还是必须预定义?

推荐答案

你使用的DirectoryEntry constructor需要103 argumentstring而不是secure string.

Read-Host-AsSecureString outputs a System.Security.SecureString对象一起使用时.将其转换回string并将其作为参数传递给构造函数应该可以解决这个问题:

$secpassw = Read-Host 'Enter password' -AsSecureString
$password = [System.Net.NetworkCredential]::new('', $secpassw).Password

还值得注意的是,由于您需要用户名和密码,因此Get-Credential可能是一种更优雅的询问方式,使用NetworkCredential转换安全字符串的相同技术也会起作用:

$cred  = Get-Credential
$passw = [System.Net.NetworkCredential]::new('', $cred.Password).Password

.net相关问答推荐

在计算Total毫秒时,.NET TimeSpan类中是否存在错误?

SeriLog LogConext.PushProperty在ASP.NET MVC 5中不能使用OWIN中间件

通过交互服务器渲染模式和流渲染的组合防止双重渲染

Ubuntu 22.04 + JetBrains Rider 不能做脚手架 dbContext

为什么我在环境变量中有不同的值?

是否必须使用 Visual Studio 预览才能使用 MAUI?

如何判断属性设置器是否公开

如何在选项卡中 Select Winforms NumericUpDown 中的所有文本?

如何确定计时器是否正在运行?

查找所有源硬编码字符串

判断 Windows 路径中是否存在可执行文件

struct 中需要覆盖什么以确保平等正常运行?

什么是 Hashtable 的通用版本?

找不到 Assert.Fail 和 Assert.Pass 或等效项

当程序员说针对接口而不是对象的代码时,他们是什么意思?

设置 System.Drawing.Color 值

单元测试 C# 保护方法

从 OpenFileDialog 路径/文件名中提取路径

DataGridView 在我的两个屏幕之一上的可怕重绘性能

ToLowerInvariant() 有什么问题?