こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WMIを利用。Part2

はじめましてこんにちわ。
現在、WindowsのWSHのWMIを利用して、
パスワードが無期限ではないユーザーを無期限にしようと思っています。
ソースコードをさがしたり、こちらの質問箱に質問したところ、
どうも
・ソースコードが正しく走るのは確認が取れている。
・こちら側の環境で走らない。(ActiveDirectoryなどほか)
・逆にスタンドアロンの環境でもいいので走らないか。
ということです。
どうぞご回答よろしくお願いします。
ソースは以下です。

Option Explicit
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000

Dim WshShell
Dim strEnvDnsDomain, arrItem, baseDN, i
Dim szDomain, szOU, szDN, intUAC, objUser
Dim objConnection, objCommand, objRecordSet
Dim strCommandText

szOU = "OU=Students"

Set WshShell = CreateObject("WScript.Shell")
strEnvDnsDomain = WshShell.ExpandEnvironmentStrings("%USERDNSDOMAIN%")
If Left(strEnvDnsDomain, 1) = "%" Then
WScript.Echo "操作しているPCはActive Directoryドメインに参加していないようです。" & vbNewLine & "終了します。"
WScript.Quit
End If
arrItem = Split(strEnvDnsDomain, ".")
baseDN = ""
For i = 0 to UBound(arrItem)
If i = 0 Then
baseDN = "DC=" & arrItem(i)
Else
baseDN = baseDN & ",DC=" & arrItem(i)
End If
Next

szDomain = baseDN
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection

strCommandText = "<LDAP://" & szOU & "," & szDomain & ">;" & _
"(&(objectCategory=person)(objectClass=user)" & _
"(!userAccountControl:1.2.840.113556.1.4.803:=65536));" & _
"userAccountControl,sAMAccountName,distinguishedName;" & _
"subtree"

objCommand.CommandText = strCommandText
Set objRecordSet = objCommand.Execute

Do Until objRecordset.EOF
szDN = objRecordset.Fields("distinguishedName")
intUAC = objRecordset.Fields("userAccountControl")
Set objUser = GetObject("LDAP://" & szDN )
objUser.Put "userAccountControl", intUAC XOR ADS_UF_DONT_EXPIRE_PASSWD
objUser.SetInfo
WScript.Echo szDN
objRecordset.MoveNext
Loop
objConnection.Close
Set objCommand = Nothing

WScript.Echo "END"

投稿日時 - 2008-05-08 15:14:52

QNo.4006735

すぐに回答ほしいです

質問者が選んだベストアンサー

ローカルの全ユーザーのパスワードを無期限にします。
---
Option Explicit
Const UF_DONT_EXPIRE_PASSWD = &H10000

Dim WshShell
Dim strEnvDomain, strInfo
Dim objContainer, adsObject
Dim intUserFlags, intNewFlags

Set WshShell = CreateObject("WScript.Shell")
strEnvDomain = WshShell.ExpandEnvironmentStrings("%USERDOMAIN%")

On Error Resume Next
Set objContainer = GetObject("WinNT://" & strEnvDomain )
If Err.Number <> 0 Then
WScript.Echo "USERDOMAIN: " & vbTab & "接続できません"
WScript.Quit
End If
On Error Goto 0

objContainer.GetInfo
For Each adsObject In objContainer
If adsObject.Class = "User" Then
intUserFlags = adsObject.Get("userFlags")
If Not intUserFlags And UF_DONT_EXPIRE_PASSWD Then
intNewFlags = intUserFlags Or UF_DONT_EXPIRE_PASSWD
adsObject.Put "userFlags", intNewFlags
adsObject.SetInfo
' WScript.Echo adsObject.Name
End If
End If
Next

WScript.Echo "End"
---

投稿日時 - 2008-05-08 16:45:24

補足

返答ありがとうございます。
↑スクリプトで無事走りました。
何度もすみません。詳細を話さなかったため手間取って申し訳ありませんでした。

本当に何度もありがとうございました。

投稿日時 - 2008-05-08 16:57:56

お礼

無事解決しました。
何度も丁寧に回答いただきました。
これでめどが立ちそうです。
ありがとうございました。

投稿日時 - 2008-05-08 17:01:27

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

また来ました。

ipconfig /all
でDCのDNSサーバを参照していますか?
これが正しくない場合は、LDAPで接続できないので別の方法で接続する必要があります。

このコードはローカルユーザー列挙するスクリプトです。
以下のコードでつながりますか?
最初の30ユーザーを表示するようにしていますが、この中にパスワードを無期限にしたいユーザーは含まれますか?
---
Option Explicit
Const LIST_LIMIT = 30

Dim WshShell
Dim strEnvDomain, strInfo, counter
Dim objContainer, adsObject

Set WshShell = CreateObject("WScript.Shell")
strEnvDomain = WshShell.ExpandEnvironmentStrings("%USERDOMAIN%")

On Error Resume Next
Set objContainer = GetObject("WinNT://" & strEnvDomain )
If Err.Number <> 0 Then
WScript.Echo "USERDOMAIN: " & vbTab & "接続できません"
WScript.Quit
End If
On Error Goto 0

strInfo = ""
counter = 0
objContainer.GetInfo
For Each adsObject In objContainer
If adsObject.Class = "User" Then
strInfo = strInfo & vbNewLine & adsObject.Name
counter = counter + 1
If counter >= LIST_LIMIT Then Exit For
End If
Next

WScript.Echo strInfo
---

投稿日時 - 2008-05-08 16:01:03

補足

回答ありがとうございます。
細かなお話をするのを忘れていました。
話をまとめますと
サーバーを立てようとしてWIN2000サーバーをインストールしてそのときに
WINにドメインを追加するのですが、そのときドメイン数が10~20ぐらいあって初期設定で無期限にチェックが入っていないため、手間がかかるのでWSHのWMIを使いたいということです。
そのため、ActiveDirectoryなどは利用していなく、スタンドアロン環境で、ただ、無期限チェックボックスにチェックをしたいということです。
途中でお話すればよかったのですが、すぐできると思っていたのでお話できませんでした。どうもすみません。
↑のようにスタンドアロン環境のADに参加しないWin2000サーバーです。
以上よろしくお願いします。

投稿日時 - 2008-05-08 16:04:56

お礼

↑間違いました。ドメインではなくユーザーの追加です。
何度も申し訳ありません。

投稿日時 - 2008-05-08 16:30:11

あなたにオススメの質問