0

** やあ!誰かが似たようなことを試したのではないかと思っていましたが、いくつかのコードを多くの接着剤でマージしました...しかし、私はvbsの初心者なので、そのほとんどが間違っていると確信できます。基本的に、組み込みの管理者アカウントのレビュー/更新中に、このタスクの自動 vbscript を使用して多くの時間を節約したいと考えていました。6 つのアカウント名があり、それぞれに特定のパスワードが設定されています。どのローカル アカウント名が各サーバーで使用されているかについては 100% 確信が持てませんが、手動で確認するか、このスクリプトが可能なアカウント名を読み取る別のファイルを使用できるかどうかを確認する必要があるかもしれません。これが私が持っているものです:**

**更新 8-29-12 a (削除)

**更新 8-29-12 b 「これは機能しています..しかし、テストして NDC の cpau を使用する必要があります」

Option Explicit

Dim strExcelPath, objExcel, objSheet, intRow, strUserDN, strPassword, comp
Dim objUser

' Spreadsheet file.
strExcelPath = "c:\List.xls"

' Bind to Excel object.
On Error Resume Next
Set objExcel = CreateObject("Excel.Application")
If (Err.Number <> 0) Then
    On Error GoTo 0
    Wscript.Echo "Excel application not found."
    Wscript.Quit
End If
On Error GoTo 0

' Open spreadsheet.
On Error Resume Next
objExcel.Workbooks.Open strExcelPath
If (Err.Number <> 0) Then
    On Error GoTo 0
    Wscript.Echo "Spreadsheet cannot be opened: " & strExcelPath
    Wscript.Quit
End If
On Error GoTo 0

' Bind to worksheet.
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)


intRow = 2
Do While objSheet.Cells(intRow, 1).Value <> ""
    comp = objSheet.Cells(intRow, 1).Value
    strUserDN = objSheet.Cells(intRow, 2).Value
    strPassword = objSheet.Cells(intRow, 3).Value
    On Error Resume Next
    Set objuser = GetObject ("WinNT://" & comp & "/" & strUserDN & ",user")
    If (Err.Number <> 0) Then
        On Error GoTo 0
        Wscript.Echo "Data NOT found: "
    Else
        objUser.SetPassword strPassword
        If (Err.Number <> 0) Then
            On Error GoTo 0
            Wscript.Echo "Password NOT set for: " & strUserDN
        Else


        End If
    End If
    intRow = intRow + 1
Loop

' Close the workbook.
objExcel.ActiveWorkbook.Close

' Quit Excel.
objExcel.Application.Quit

Wscript.Echo "Done"

私のオプション「B」は、次のようなものを使用して最初からやり直すことができます: @echo off

for /F "delims=" %%i in (servers.txt) do ( psexec \%%i NET USER > %%i.txt )

**

これを解決するには何百もの方法があるかもしれません.1か月後にADにリストされているサーバーとリストされていないサーバーの管理者パスワードを誰かが手動で変更することを避けるという私の考えです。

どんな助けでも大歓迎です。

よろしく

4

2 に答える 2

0

このコードは、変数で指定された 1 台のコンピューターのローカル ユーザーを一覧表示し、server各ユーザーのユーザー ID を出力します。

server = "YourServerName"
Set oComputer = GetObject("WinNT://" & server & "")
oComputer.Filter = Array("User")
For Each oUser in oComputer
  WScript.Echo oUser.Name
Next
于 2012-08-27T18:39:08.813 に答える
0
'Objective: check multiple servers for admin accounts status and report to html file

Set iFSO = CreateObject("Scripting.FilesyStemObject") 
Set oFSO = CreateObject("Scripting.FilesyStemObject") 

InputFile = WScript.Arguments.Named("servers")
if len(InputFile) < 1 then
    wscript.echo "Error: Servers Parameter not found" & vbCrLf
    show_usage
    wscript.quit
end if

Outputfile= InputFile & "_guest_admins_" + cstr(Month(now()))+"_"+cstr(day(now()))+".htm" 

if not ofso.FileExists(inputfile) then
    wscript.echo "Error: Server list file not Found."
    wscript.quit
end if

Set ofile = ofso.createTextFile(OutputFile, True) 
Set ifile = iFSO.OpenTextFile(inputfile) 

ofile.writeline "<html>" & html_head & "<body>"

    ofile.writeline "<table border=1 cellpadding=1 cellspacing=0>"
    ofile.writeline o 
    ofile.writeline "<tr><td>Hostname</td><td>User</td><td>Disabled</td><td>Locked</td><td>Expiration Date</td><td>Flags</td><td>BuiltIn</td></tr>"

Do until ifile.AtEndOfLine
Computer = ifile.ReadLine
if ping(Computer) then
            Builtin = ""
            if Check_WMI(Computer) then
                Builtin = GetBuiltInAccount(Computer)
            else
                Builtin = "WMI Fail"
            end if

            strt = now
            wscript.echo "Checking Users for server: " & Computer

            on error resume next

            Set objGroup = GetObject("WinNT://" & Computer & "/Administrators,group")

            if err.number <> 0 then
                wscript.echo "GetObject WinNT Failed"
                ofile.writeline "<tr><td>" & computer & "</td><td colspan=6 align=center>GetObject WinNT Fail: "& err.number &"</td></tr>"
            else            
                on error goto 0

                For Each objUser in objGroup.Members
                        ofile.writeline GetUserNT(computer, objUser.Name, Builtin)
                Next

                wscript.echo "Elapsed Time: " & datediff("s", strt, now) & " seconds"
            end if
else
    wscript.echo computer & " does not reply ping"
    ofile.writeline "<tr><td>" & computer & "</td><td colspan=6 align=center>No Ping Reply</td></tr>"
end if
Loop 
ofile.writeline "</table>"

ofile.writeline "</body></html>"

function ping(target)
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colPingedComputers = objWMIService.ExecQuery("Select * from Win32_PingStatus Where Address = '"& target & "'")
    For each objComputer in colPingedComputers
      ' If the status code is Null or Not 0 then the ping failed
      If IsNull( objComputer.StatusCode ) Or objComputer.StatusCode <> 0 Then 
        ' Set the function to return Boolean FALSE
        Ping = False
      Else
        ' Set the function to return Boolean TRUE
        Ping = True
      End If
    Next
end function

sub show_usage
    wscript.echo "Usage:  cscript chkusers /servers:list.txt" & vbcrlf

    wscript.echo vbtab & "/servers Parameter is a Text File one Servername per Line" & vbcrlf

    wscript.echo "Notes:  This script generates an html report of server admin accounts."
    wscript.echo "  Results are saved in a file named + date + htm extension."
    wscript.echo "  Output example filename: list_guest_admins_" + cstr(Month(now()))+"_"+cstr(day(now()))+".htm"

end sub

Function Check_WMI(strServer)
    On Error Resume Next ' error handling off

    ' create object reference, connect to namespace root\default
    Set oCimOmId = GetObject("winmgmts:"& strServer & "\root\default:__cimomidentification=@")

    ' Test whether WMI is present or not.
    If Err <> 0 then
        Check_WMI= true
    else
        Check_WMI= false
    end if
    on error goto 0
end function

Sub EnumNameSpaces(strNameSpace)
    'call enumnamespaces("root")
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\" & strNameSpace)
    Set colNameSpaces = objWMIService.InstancesOf("__NAMESPACE")
    For Each objNameSpace In colNameSpaces
        Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
    Next
End Sub

function CSS
tt = "<style type=""text/css"">" & vbcrlf
tt=tt & " body {font-family:Verdana;font-size: 10px;color: #49403B;background: #EFEFEF;}" & vbcrlf
tt=tt & "table {font-family:Verdana;font-size: 12px; empty-cells:show; }" & vbcrlf
tt=tt & "</style>"  & vbcrlf
CSS = tt
end function

function html_head
    tt="<head>" & vbcrlf
    tt=tt & CSS
    html_head = tt & "</head>" & vbcrlf
end function


function GetUserNT(strComputer, usr, bltin)
    Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000

    o=""
    On Error Resume Next

    Set objUser = GetObject("WinNT:// " & strComputer & "/" & usr & " ")

    o=o& "<tr><td>"& strcomputer &"</td><td>"& usr &"</td>"

    if len(objUser.AccountDisabled) = 0 then exit function

    o=o& "<td>&nbsp;"& StrDisabled(objUser.AccountDisabled) &"</td>"
    o=o& "<td>&nbsp;"& StrLocked(objUser.IsAccountLocked) &"</td>"


    o=o& "<td>&nbsp;"
        o=o& objUser.Get("UserFlags") AND ADS_UF_DONT_EXPIRE_PASSWD
    o=o& "</td>"

    o=o& "<td>&nbsp;"
        o=o& objUser.AccountExpirationDate
    o=o& "</td>"

    if lcase(bltin) = lcase(usr) then
        o=o & "<td>&nbsp;Built-In</td>"
    elseif instr(bltin, "[[Fail]]") > 0 then
        o=o & "<td>&nbsp;"& bltin &"</td>"
    else
        o=o & "<td>&nbsp;</td>"
    end if

    o = o & "</tr>"

    GetUserNT = o
end function

function StrLocked(str)
    if str = "True" then
        StrLocked = "Locked"
    else
        StrLocked = "Unlocked"
    end if
end function

function StrDisabled(str)
    if str = "True" then
        StrDisabled = "Disabled"
    else
        StrDisabled = "Enabled"
    end if
end function

function GetUsers(strComputer,grp,usr)
    On Error Resume Next
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_UserAccount Where name = '"& usr &"'")
    o=""
    For Each objItem in colItems
        o=o& "<tr>"
        o=o& "<td>" & strComputer & "</td>"
        o=o& "<td>" & grp & "</td>"
        o=o& "<td>" & objItem.AccountType & "</td>"
        o=o& "<td>" & objItem.Caption & "</td>"
        o=o& "<td>" & objItem.Description & "</td>"
        o=o& "<td>" & objItem.Disabled & "</td>"
        o=o& "<td>" & objItem.Domain & "</td>"
        o=o& "<td>" & objItem.FullName & "</td>"
        o=o& "<td>" & objItem.LocalAccount & "</td>"
        o=o& "<td>" & objItem.Lockout & "</td>"
        o=o& "<td>" & objItem.Name & "</td>"
        o=o& "<td>" & objItem.PasswordChangeable & "</td>"
        o=o& "<td>" & objItem.PasswordExpires & "</td>"
        o=o& "<td>" & objItem.PasswordRequired & "</td>"
        o=o& "<td>" & objItem.SID & "</td>"
        o=o& "<td>" & objItem.SIDType & "</td>"
        o=o& "<td>" & objItem.Status & "</td>"
        o=o& "</tr>"
    Next
    on error goto 0
    GetUsers = o
end function





Function getlcl(srvname)
    Set objComputer = GetObject("WinNT://" & srvname & "/Administrators,group")

 wscript.echo "Local Accounts on " & srvname
 wscript.echo "-------------------------------------------------"

    For Each objUser in objComputer.Members
        Wscript.Echo vbTab & objUser.Name
    Next

 wscript.echo "-------------------------------------------------"
end Function

function GetBuiltInAccount(strComputer)

    on error resume next
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    if err.number <> 0 then
        GetBuiltInAccout = "Get Object WMI [[Fail]]: " & err.number & ":: " & err.description
        err.clear
        exit function
    end if
    on error goto 0

    on error resume next
    Set colAccounts = objWMIService.ExecQuery("Select * From Win32_UserAccount Where Domain = '" & strComputer & "'")

    if err.number <> 0 then
        GetBuiltInAccout = "WMI_ExecQuery [[Fail]]: " & err.number & ":: " & err.description
        err.clear
        exit function
    end if
    on error goto 0

    on error resume next
    For Each objAccount in colAccounts
        if err.number <> 0 then
            GetBuiltInAccout = "WMI_ExecQuery_ForEachAccount [[Fail]]: " & err.number & ":: " & err.description
            wscript.echo "WMI_ExecQuery_ForEachAccount [[Fail]]: " & err.number & ":: " & err.description
            err.clear
            exit function
        end if
        on error goto 0

        If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then
            GetBuiltInAccount = objAccount.Name
            exit function

        End If
    Next
end function

特記事項

ドメイン サーバーの場合:

以下の行を含むバッチ/コマンド ファイル (admins.cmd など) を作成します。

cscript admin.vbs /servers:list.txt

スタンドアロン サーバーの場合: -CPAU.exe をダウンロードします。

以下の行を含むバッチ/コマンド ファイル (adminsNDC.cmd のようなもの) を作成します。

CPAU -u %COMPUTERNAME%\administrator -p mypassword -ex "cscript.exe Admins.vbs /servers:list.txt" -nowarn


-ローカル管理者レポート v1-

指示

ドメイン サーバーの場合: 1-スキャンするサーバーを次の場所に追加します: "list.txt" 2-次のファイルの "1 つ" に対してスケジュールされたタスクを実行/作成します: admins.cmd |Hostname|User| Disabled |Locked |Expiration Date| Flags |BuiltIn |) 3-HTML レポートを確認します (IE 経由で Excel に送信できます)。

スタンドアロン サーバーの場合:

1-スキャンするサーバーを「list.txt」に追加します 2-アカウント名とパスワード情報を adminsNDC.cmd に編集します 3-adminsNDC.cmd <-------> を実行します (次のようになります: |ホスト名|User| Disabled |Locked |Expiration Date| Flags |BuiltIn |) 3-HTML レポートを確認する



サーバーとアカウントのレポートを取得した後、このスクリプトを使用してパスワードの更新を実行できます。

Option Explicit

Dim strExcelPath, objExcel, objSheet, intRow, strUserDN, strPassword, comp
Dim objUser

' Spreadsheet file.
strExcelPath = "c:\List.xls"

' Bind to Excel object.
On Error Resume Next
Set objExcel = CreateObject("Excel.Application")
If (Err.Number <> 0) Then
    On Error GoTo 0
    Wscript.Echo "Excel application not found."
    Wscript.Quit
End If
On Error GoTo 0

' Open spreadsheet.
On Error Resume Next
objExcel.Workbooks.Open strExcelPath
If (Err.Number <> 0) Then
    On Error GoTo 0
    Wscript.Echo "Spreadsheet cannot be opened: " & strExcelPath
    Wscript.Quit
End If
On Error GoTo 0

' Bind to worksheet.
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)


intRow = 2
Do While objSheet.Cells(intRow, 1).Value <> ""
    comp = objSheet.Cells(intRow, 1).Value
    strUserDN = objSheet.Cells(intRow, 2).Value
    strPassword = objSheet.Cells(intRow, 3).Value
    On Error Resume Next
    Set objuser = GetObject ("WinNT://" & comp & "/" & strUserDN & ",user")
    If (Err.Number <> 0) Then
        On Error GoTo 0
        Wscript.Echo "Data NOT found: "
    Else
        objUser.SetPassword strPassword
        If (Err.Number <> 0) Then
            On Error GoTo 0
            Wscript.Echo "Password NOT set for: " & strUserDN
        Else


        End If
    End If
    intRow = intRow + 1
Loop

' Close the workbook.
objExcel.ActiveWorkbook.Close

' Quit Excel.
objExcel.Application.Quit

Wscript.Echo "Done"
于 2012-08-30T01:23:09.517 に答える