关于 vb.net:.Invoke(“SetPassword”, …) 导致”RPC 服务器不可用”错误

.Invoke(“SetPassword”, …) results in “RPC server is unavailable” error

我有一个页面可以使用 VB.NET 在我们的活动目录中创建新用户
我正在使用以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim rootEntry As New DirectoryEntry
With rootEntry
    .Path ="LDAP://" & strServer &"/" & strLDAP
    .AuthenticationType = AuthenticationTypes.Secure
    .Username = strServerUsername
    .Password = strServerPassword
End With



Dim newUser As DirectoryEntry = rootEntry.Children.Add("CN=" & strCN,"user")
With newUser
    .CommitChanges()
    .Properties("userPrincipalName").Value = TextPN.Text
    .Properties("sAMAccountName").Value = TextAlias.Text
    .Properties("givenname").Value = TextGivenname.Text
    .Properties("sn").Value = TextSurname.Text
    ……
    .CommitChanges()

    .Invoke("setPassword", New Object() {strDefaultPassword})
    .CommitChanges()
    .Properties("userAccountControl").Value = &H0001
    .CommitChanges()        
End With

此代码过去运行良好。
现在我们已经将我们的网络服务器迁移到 Windows Server 2008 R2 和 IIS 7.5,突然代码不再工作了。 (.net 框架是 2.0,不能更改)
用户仍然在我们的活动目录中创建,但该帐户被自动禁用并且未设置密码。

调查此问题表明在该行抛出异常

1
 .Invoke("setPassword", New Object() {strDefaultPassword})

异常

1
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

用于连接到 AD 的用户帐户仍然是相同的,并且具有域管理员权限。
由于代码没有任何变化,我认为这肯定有另一个原因不再起作用?防火墙设置、IIS 配置、..?

有什么想法吗??

我知道这里有类似的情况尝试创建一个新的 Active Directory 用户,Invoke("SetPassword",pwd) throws "The RPC server is available"
,但这对我没有帮助。


DirectoryEntry.Invoke() 需要 AuthenticationType.Secure。这意味着它需要能够通过 Kerberos 或 NTLM 对请求进行身份验证。

它首先尝试使用 LDAPS (TCP 636),然后在由于缺少或无效证书而超时或失败时回退到 CiFS (TCP445)。如果这两个端口都没有打开,它将失败并出现"RPC 服务器不可用"异常。


检查 TCP/UDP 445 端口是否在您的防火墙上打开。
要从域外连接到 AD 服务器,您需要打开以下端口:
. TCP/UDP 389 (LDAP)
. TCP 3268 (GC)
. TCP/UDP 445(基于 IP 的 SMB)