Solved

Verifying Group membership and removing users from groups

Posted on 2011-09-30
12
260 Views
Last Modified: 2012-05-12
Hey all,

I am new to VB scripting, so have been bumping around in the dark on this one.  I have a task which i would like to automate with a script. I have a list of users and secutiry groups formatted in a .csv file.  (group1; user1,user2,user3)

For auditing and security purposes, i need to be able to remove any users from the security group whom are not listed in the .csv
I was thinking that i will need to break this down into steps....

Step one:  Verify if users listed in the .csv are members of the security group
Step two:  Compare the actual secutiry group membership to the users listed in the .csv
Step three:  Remove users from the security group if not on the .csv

I already have a script which adds multiple users to different groups in different OU's.  How can i incoperate this second function?

Any help would be greatly appreciated. Thanks
ON ERROR RESUME NEXT

Dim DisplayEcho
Const ADS_PROPERTY_APPEND = 3

'---------------------------------------------------------------------------
'      User Variables
'---------------------------------------------------------------------------
'OU where groups are located
strOU="ou=temp,ou=test,dc=somewhere,dc=com"

'text file groups & users
'line format:  Group Name;User Name1;User Name2;
strTextFilename="C:\Users\laitsvc\Desktop\Test_Scripts\groups.txt"

strLogFileName="C:\Users\laitsvc\Desktop\Test_Scripts\results.txt"

'True to display echos, false to hide
DisplayEcho = True
'---------------------------------------------------------------------------

Set WshShell=CreateObject("Wscript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")

If DisplayEcho=True then
      'Force CSCRIPT
      If instr(lcase(wscript.fullname),"wscript") then
            wshshell.run "cmd /k cscript //nologo " & chr(34) & wscript.scriptfullname & Chr(34),1,false
            wscript.quit
      End If
End If

Set oLogFile=fso.OpenTextFile(strLogFileName,2,true)

Set oFile=fso.OpenTextFile(strTextFilename,1)
text=oFile.ReadAll
oFile.close

arrText=split(text,vbCrLf)


For each line in arrText
      arrLine=split(line,";")
      strGroup=arrLine(0)
      err.Clear
      strGroupPath=GetADsPath(strGroup,"group")
      
      If strGroupPath = "" then
            Output "ERROR: Could not find group:  " & strGroup
            err.clear
      Else
      		Set objGroup = GetObject(strGroupPath)
            For i = 1 to ubound(arrLine)
                  strUser=arrLine(i)
                  strADsPath_user=GetADsPath(strUser,"user")
                  Set objUser=GetObject(strADsPath_user)
                  strUserDN=objUser.DistinguishedName
                  If strUserDN="" then 
                        Output strGroup & "... Could not find user:  " & strUser
                  Else
                        objGroup.PutEx ADS_PROPERTY_APPEND, _
                              "member", Array(strUserDN)
                        objGroup.SetInfo
            
                        If err.number <> 0 then 
                              If err.number="-2147019886" then
                                    Output strGroup & " <-- " & strUser & " (Already a member)"
                              Else
                                    Output "ERROR adding " & strUser & " to " & strGroup & vbCrLf & _
                                          vbTab & err.number & " " & err.description
                              End If
                              err.clear
                        Else
                              'Uncomment this line to show successful additions
                              'Output strGroup & " <-- " & strUser
                        End If
                  End If
                  strUser=""
                  strUserDN=""
                  strADsPath_user=""
                  Set objUser=Nothing
            Next
            
      End If

      Set objGroup=Nothing
      arrLine=""
      strGroup=""

Next

oLogFile.close

Output ""
Output "Operation complete.  See Log:  " & strLogFileName


Sub Output(txt)
      If DisplayEcho=True then wscript.echo txt
      oLogFile.writeLine txt
End Sub



Function GetADsPath(myName,myType)
      Const ADS_SCOPE_SUBTREE = 2

      strADsPath=""

      Set objRootDSE = GetObject("LDAP://rootDSE")
      strRootDSE = objRootDSE.Get("defaultNamingContext")      

      Set objConnection = CreateObject("ADODB.Connection")
      Set objCommand =   CreateObject("ADODB.Command")
      objConnection.Provider = "ADsDSOObject"
      objConnection.Open "Active Directory Provider"
      Set objCommand.ActiveConnection = objConnection
      
      objCommand.Properties("Page Size") = 1000
      objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
      
      objCommand.CommandText = _
            "SELECT ADsPath FROM 'LDAP://" & strRootDSE & "' WHERE objectCategory='" & myType & "' " & _ 
                  "AND Name ='" & myName & "' "
      
      Set objRecordSet = objCommand.Execute
      
      objRecordSet.MoveFirst
      strADsPath = ""
      strADsPath= objRecordSet.Fields("ADsPath").value

      GetADsPath=strADsPath
      
      Set objConnection=Nothing
      Set objCommand=Nothing
      Set objRecordSet=Nothing
End Function

Open in new window

0
Comment
Question by:MD187
  • 8
  • 4
12 Comments
 
LVL 65

Expert Comment

by:RobSampson
ID: 36899245
Hi, try this.  I haven't tested it, but I've added the bit that begins with
' GO THROUGH THE GROUP MEMBERS AND REMOVE USERS THAT ARE NOT SUPPOSED TO BE IN IT

Regards,

Rob.
ON ERROR RESUME NEXT

Dim DisplayEcho
Const ADS_PROPERTY_APPEND = 3

'---------------------------------------------------------------------------
'      User Variables
'---------------------------------------------------------------------------
'OU where groups are located
strOU="ou=temp,ou=test,dc=somewhere,dc=com"

'text file groups & users
'line format:  Group Name;User Name1;User Name2;
strTextFilename="C:\Users\laitsvc\Desktop\Test_Scripts\groups.txt"

strLogFileName="C:\Users\laitsvc\Desktop\Test_Scripts\results.txt"

'True to display echos, false to hide
DisplayEcho = True
'---------------------------------------------------------------------------

Set WshShell=CreateObject("Wscript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")

If DisplayEcho=True then
      'Force CSCRIPT
      If instr(lcase(wscript.fullname),"wscript") then
            wshshell.run "cmd /k cscript //nologo " & chr(34) & wscript.scriptfullname & Chr(34),1,false
            wscript.quit
      End If
End If

Set oLogFile=fso.OpenTextFile(strLogFileName,2,true)

Set oFile=fso.OpenTextFile(strTextFilename,1)
text=oFile.ReadAll
oFile.close

arrText=split(text,vbCrLf)


For each line in arrText
      arrLine=split(line,";")
      strGroup=arrLine(0)
      err.Clear
      strGroupPath=GetADsPath(strGroup,"group")
      
      If strGroupPath = "" then
            Output "ERROR: Could not find group:  " & strGroup
            err.clear
      Else
      		Set objGroup = GetObject(strGroupPath)
      		
      		' ADD USERS TO THE GROUP FROM THE CSV FILE
            For i = 1 to ubound(arrLine)
                  strUser=arrLine(i)
                  strADsPath_user=GetADsPath(strUser,"user")
                  Set objUser=GetObject(strADsPath_user)
                  strUserDN=objUser.DistinguishedName
                  If strUserDN="" then 
                        Output strGroup & "... Could not find user:  " & strUser
                  Else
                        objGroup.PutEx ADS_PROPERTY_APPEND, _
                              "member", Array(strUserDN)
                        objGroup.SetInfo
            
                        If err.number <> 0 then 
                              If err.number="-2147019886" then
                                    Output strGroup & " <-- " & strUser & " (Already a member)"
                              Else
                                    Output "ERROR adding " & strUser & " to " & strGroup & vbCrLf & _
                                          vbTab & err.number & " " & err.description
                              End If
                              err.clear
                        Else
                              'Uncomment this line to show successful additions
                              'Output strGroup & " <-- " & strUser
                        End If
                  End If
                  strUser=""
                  strUserDN=""
                  strADsPath_user=""
                  Set objUser=Nothing
            Next
            
            ' GO THROUGH THE GROUP MEMBERS AND REMOVE USERS THAT ARE NOT SUPPOSED TO BE IN IT
            strLine = LCase(line)
            If Left(strLine, 1) <> ";" Then strLine = ";" & strLine
            If Right(strLine, 1) <> ";" Then strLine = strLine & ";"
            For Each objUser In objGroup.Members
            	If InStr(strLine, LCase(";" & objUser.Name & ";") = 0 Then
            		Err.Clear
            		objGroup.Remove "LDAP://" & objUser.distinguishedName
                    If err.number <> 0 Then
                          Output "ERROR removing " & strUser & " from " & strGroup & vbCrLf & _
                                 vbTab & err.number & " " & err.description
                    Else
                          'Uncomment this line to show successful additions
                          Output "Removed " & strUser & " from " & strGroup
                    End If
					Err.Clear
            	End If
            Next
            
      End If

      Set objGroup=Nothing
      arrLine=""
      strGroup=""

Next

oLogFile.close

Output ""
Output "Operation complete.  See Log:  " & strLogFileName


Sub Output(txt)
      If DisplayEcho=True then wscript.echo txt
      oLogFile.writeLine txt
End Sub



Function GetADsPath(myName,myType)
      Const ADS_SCOPE_SUBTREE = 2

      strADsPath=""

      Set objRootDSE = GetObject("LDAP://rootDSE")
      strRootDSE = objRootDSE.Get("defaultNamingContext")      

      Set objConnection = CreateObject("ADODB.Connection")
      Set objCommand =   CreateObject("ADODB.Command")
      objConnection.Provider = "ADsDSOObject"
      objConnection.Open "Active Directory Provider"
      Set objCommand.ActiveConnection = objConnection
      
      objCommand.Properties("Page Size") = 1000
      objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
      
      objCommand.CommandText = _
            "SELECT ADsPath FROM 'LDAP://" & strRootDSE & "' WHERE objectCategory='" & myType & "' " & _ 
                  "AND Name ='" & myName & "' "
      
      Set objRecordSet = objCommand.Execute
      
      objRecordSet.MoveFirst
      strADsPath = ""
      strADsPath= objRecordSet.Fields("ADsPath").value

      GetADsPath=strADsPath
      
      Set objConnection=Nothing
      Set objCommand=Nothing
      Set objRecordSet=Nothing
End Function

Open in new window

0
 

Author Comment

by:MD187
ID: 36903379
Good morning Rob,

Thank you for that.  I ran it, but am getting an error on line 91, char 68

If InStr(strLine, LCase(";" & objUser.Name & ";") = 0 Then
                        Err.Clear
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 36906289
Ooops, I forgot a closing bracket.

Change
If InStr(strLine, LCase(";" & objUser.Name & ";") = 0 Then
to
If InStr(strLine, LCase(";" & objUser.Name & ";")) = 0 Then

Rob.
0
 

Author Comment

by:MD187
ID: 36906491
Again Rob, awesome.  

Making some headway, but now seems to be removing all existing members from AD Security Groups and not adding the new users on the csv either.  
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 36906649
What is the format of your username in the CSV file?  Is it by name? or login name?
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 36906664
You may need to change
                  If InStr(strLine, LCase(";" & objUser.Name & ";")) = 0 Then

to this
                  If InStr(strLine, LCase(";" & Mid(objUser.Name, 4) & ";")) = 0 Then

I'll see if I can knock up a test.

Rob.
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 65

Expert Comment

by:RobSampson
ID: 36906687
OK,if you have full names, like
GroupName;John Smith;Joe Bloggs

Then this works.

Regards,

Rob.
'MsgBox GetADsPath("Robert Sampson", "user")
'WScript.Quit

ON Error RESUME Next

Dim DisplayEcho
Const ADS_PROPERTY_APPEND = 3

'---------------------------------------------------------------------------
'      User Variables
'---------------------------------------------------------------------------
'OU where groups are located
strOU="ou=temp,ou=test,dc=somewhere,dc=com"

'text file groups & users
'line format:  Group Name;User Name1;User Name2;
strTextFilename="C:\Users\laitsvc\Desktop\Test_Scripts\groups.txt"

strLogFileName="C:\Users\laitsvc\Desktop\Test_Scripts\results.txt"

'True to display echos, false to hide
DisplayEcho = True
'---------------------------------------------------------------------------

Set WshShell=CreateObject("Wscript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")

If DisplayEcho=True then
      'Force CSCRIPT
      If instr(lcase(wscript.fullname),"wscript") then
            wshshell.run "cmd /k cscript //nologo " & chr(34) & wscript.scriptfullname & Chr(34),1,false
            wscript.quit
      End If
End If

Set oLogFile=fso.OpenTextFile(strLogFileName,2,true)

Set oFile=fso.OpenTextFile(strTextFilename,1)
text=oFile.ReadAll
oFile.close

arrText=split(text,vbCrLf)


For each line in arrText
      arrLine=split(line,";")
      strGroup=arrLine(0)
      err.Clear
      strGroupPath=GetADsPath(strGroup,"group")
      
      If strGroupPath = "" then
            Output "ERROR: Could not find group:  " & strGroup
            err.clear
      Else
      		Set objGroup = GetObject(strGroupPath)
      		
      		' ADD USERS TO THE GROUP FROM THE CSV FILE
            For i = 1 to ubound(arrLine)
                  strUser=arrLine(i)
                  strADsPath_user=GetADsPath(strUser,"user")
                  Set objUser=GetObject(strADsPath_user)
                  strUserDN=objUser.DistinguishedName
                  If strUserDN="" then 
                        Output strGroup & "... Could not find user:  " & strUser
                  Else
                        objGroup.PutEx ADS_PROPERTY_APPEND, _
                              "member", Array(strUserDN)
                        objGroup.SetInfo
            
                        If err.number <> 0 Then 
                              If err.number="-2147019886" then
                                    Output strGroup & " <-- " & strUser & " (Already a member)"
                              Else
                                    Output "ERROR adding " & strUser & " to " & strGroup & vbCrLf & _
                                          vbTab & err.number & " " & err.description
                              End If
                              err.clear
                        Else
                              'Uncomment this line to show successful additions
                              Output strGroup & " <-- " & strUser
                        End If
                  End If
                  strUser=""
                  strUserDN=""
                  strADsPath_user=""
                  Set objUser=Nothing
            Next
            
            ' GO THROUGH THE GROUP MEMBERS AND REMOVE USERS THAT ARE NOT SUPPOSED TO BE IN IT
            strLine = LCase(line)
            If Left(strLine, 1) <> ";" Then strLine = ";" & strLine
            If Right(strLine, 1) <> ";" Then strLine = strLine & ";"
            For Each objUser In objGroup.Members
            	If InStr(strLine, LCase(";" & Mid(objUser.Name, 4) & ";")) = 0 Then
            		Err.Clear
            		objGroup.Remove "LDAP://" & objUser.distinguishedName
                    If err.number <> 0 Then
                          Output "ERROR removing " & strUser & " from " & strGroup & vbCrLf & _
                                 vbTab & err.number & " " & err.description
                    Else
                          'Uncomment this line to show successful additions
                          Output "Removed " & Mid(objUser.Name, 4) & " from " & strGroup
                    End If
					Err.Clear
            	End If
            Next
            
      End If

      Set objGroup=Nothing
      arrLine=""
      strGroup=""

Next

oLogFile.close

Output ""
Output "Operation complete.  See Log:  " & strLogFileName


Sub Output(txt)
      If DisplayEcho=True then wscript.echo txt
      oLogFile.writeLine txt
End Sub



Function GetADsPath(myName,myType)
      Const ADS_SCOPE_SUBTREE = 2

      strADsPath=""

      Set objRootDSE = GetObject("LDAP://rootDSE")
      strRootDSE = objRootDSE.Get("defaultNamingContext")      

      Set objConnection = CreateObject("ADODB.Connection")
      Set objCommand =   CreateObject("ADODB.Command")
      objConnection.Provider = "ADsDSOObject"
      objConnection.Open "Active Directory Provider"
      Set objCommand.ActiveConnection = objConnection
      
      objCommand.Properties("Page Size") = 1000
      objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
      
      objCommand.CommandText = _
            "SELECT ADsPath FROM 'LDAP://" & strRootDSE & "' WHERE objectCategory='" & myType & "' " & _ 
                  "AND Name ='" & myName & "' "
      
      Set objRecordSet = objCommand.Execute
      
      objRecordSet.MoveFirst
      strADsPath = ""
      strADsPath= objRecordSet.Fields("ADsPath").value

      GetADsPath=strADsPath
      
      Set objConnection=Nothing
      Set objCommand=Nothing
      Set objRecordSet=Nothing
End Function

Open in new window

0
 
LVL 65

Expert Comment

by:RobSampson
ID: 36906692
You can delete the first two lines.

Rob.
0
 

Author Comment

by:MD187
ID: 36906758
Hey Rob,

We are using a csv formatted: TestGroup3;TestUsr1;testUsr2;testUsr3;testUsr4;testUsr5;testUsr6
"testUsr(x)" is the login name. The length of each line or number of users is variable.

Running the original script adds users 1-6 to the group.  Then when i run the script with your addition (again, thanks for all the time on this one); i have the csv formatted the same, but without testUsr6:

TestGroup3;TestUsr1;testUsr2;testUsr3;testUsr4;testUsr5

So, testUsr6 should have been removed from TestGroup3... Unfortunately, this is not the case. Can this be modified to recognize userID's rather than full names?

Also,would it be easier to break this down into two different scripts... My original to add the users, and then dissect your piece out and spawn a new script to verify and remove?

Please let me know your thoughts when you can, thanks
0
 
LVL 65

Accepted Solution

by:
RobSampson earned 500 total points
ID: 36906820
That's odd that you login IDs....the GetADsPath function that you have only searches by the "name" attribute, so to add users, you'd need to have full names in the text file.

I'm not sure how it's finding your users, unless the names happens to be the same as the login name.

Anyway, I've added a condition to the GetADsPath function so that if the type being searched for is a group, it searches by name, but if it's looking for a user, it will search by login name.

Regards,

Rob.
ON Error RESUME Next

Dim DisplayEcho
Const ADS_PROPERTY_APPEND = 3

'---------------------------------------------------------------------------
'      User Variables
'---------------------------------------------------------------------------
'OU where groups are located
strOU="ou=temp,ou=test,dc=somewhere,dc=com"

'text file groups & users
'line format:  Group Name;User Name1;User Name2;
strTextFilename="C:\Users\laitsvc\Desktop\Test_Scripts\groups.txt"

strLogFileName="C:\Users\laitsvc\Desktop\Test_Scripts\results.txt"

'True to display echos, false to hide
DisplayEcho = True
'---------------------------------------------------------------------------

Set WshShell=CreateObject("Wscript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")

If DisplayEcho=True then
      'Force CSCRIPT
      If instr(lcase(wscript.fullname),"wscript") then
            wshshell.run "cmd /k cscript //nologo " & chr(34) & wscript.scriptfullname & Chr(34),1,false
            wscript.quit
      End If
End If

Set oLogFile=fso.OpenTextFile(strLogFileName,2,true)

Set oFile=fso.OpenTextFile(strTextFilename,1)
text=oFile.ReadAll
oFile.close

arrText=split(text,vbCrLf)


For each line in arrText
      arrLine=split(line,";")
      strGroup=arrLine(0)
      err.Clear
      strGroupPath=GetADsPath(strGroup,"group")
      
      If strGroupPath = "" then
            Output "ERROR: Could not find group:  " & strGroup
            err.clear
      Else
      		Set objGroup = GetObject(strGroupPath)
      		
      		' ADD USERS TO THE GROUP FROM THE CSV FILE
            For i = 1 to ubound(arrLine)
                  strUser=arrLine(i)
                  strADsPath_user=GetADsPath(strUser,"user")
                  Set objUser=GetObject(strADsPath_user)
                  strUserDN=objUser.DistinguishedName
                  If strUserDN="" then 
                        Output strGroup & "... Could not find user:  " & strUser
                  Else
                        objGroup.PutEx ADS_PROPERTY_APPEND, _
                              "member", Array(strUserDN)
                        objGroup.SetInfo
            
                        If err.number <> 0 Then 
                              If err.number="-2147019886" then
                                    Output strGroup & " <-- " & strUser & " (Already a member)"
                              Else
                                    Output "ERROR adding " & strUser & " to " & strGroup & vbCrLf & _
                                          vbTab & err.number & " " & err.description
                              End If
                              err.clear
                        Else
                              'Uncomment this line to show successful additions
                              Output strGroup & " <-- " & strUser
                        End If
                  End If
                  strUser=""
                  strUserDN=""
                  strADsPath_user=""
                  Set objUser=Nothing
            Next
            
            ' GO THROUGH THE GROUP MEMBERS AND REMOVE USERS THAT ARE NOT SUPPOSED TO BE IN IT
            strLine = LCase(line)
            If Left(strLine, 1) <> ";" Then strLine = ";" & strLine
            If Right(strLine, 1) <> ";" Then strLine = strLine & ";"
            For Each objUser In objGroup.Members
            	If InStr(strLine, LCase(";" & objUser.samAccountName & ";")) = 0 Then
            		Err.Clear
            		objGroup.Remove "LDAP://" & objUser.distinguishedName
                    If err.number <> 0 Then
                          Output "ERROR removing " & objUser.samAccountName & " from " & strGroup & vbCrLf & _
                                 vbTab & err.number & " " & err.description
                    Else
                          'Uncomment this line to show successful additions
                          Output "Removed " & objUser.samAccountName & " from " & strGroup
                    End If
					Err.Clear
            	End If
            Next
            
      End If

      Set objGroup=Nothing
      arrLine=""
      strGroup=""

Next

oLogFile.close

Output ""
Output "Operation complete.  See Log:  " & strLogFileName


Sub Output(txt)
      If DisplayEcho=True then wscript.echo txt
      oLogFile.writeLine txt
End Sub



Function GetADsPath(myName,myType)
      Const ADS_SCOPE_SUBTREE = 2

      strADsPath=""

      Set objRootDSE = GetObject("LDAP://rootDSE")
      strRootDSE = objRootDSE.Get("defaultNamingContext")      

      Set objConnection = CreateObject("ADODB.Connection")
      Set objCommand =   CreateObject("ADODB.Command")
      objConnection.Provider = "ADsDSOObject"
      objConnection.Open "Active Directory Provider"
      Set objCommand.ActiveConnection = objConnection
      
      objCommand.Properties("Page Size") = 1000
      objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
      
      If LCase(myType) = "group" Then
	      objCommand.CommandText = _
	            "SELECT ADsPath FROM 'LDAP://" & strRootDSE & "' WHERE objectCategory='" & myType & "' " & _ 
	                  "AND Name ='" & myName & "' "
	  ElseIf LCase(myType) = "user" Then
	      objCommand.CommandText = _
	            "SELECT ADsPath FROM 'LDAP://" & strRootDSE & "' WHERE objectCategory='" & myType & "' " & _ 
	                  "AND samAccountName ='" & myName & "' "
	  End If
      
      Set objRecordSet = objCommand.Execute
      
      objRecordSet.MoveFirst
      strADsPath = ""
      strADsPath= objRecordSet.Fields("ADsPath").value

      GetADsPath=strADsPath
      
      Set objConnection=Nothing
      Set objCommand=Nothing
      Set objRecordSet=Nothing
End Function

Open in new window

0
 

Author Closing Comment

by:MD187
ID: 36909986
I would like to start out by thanking Rob for his diligent work on this question. He has definitely earned his status as a genius.  All the effort he has put forth was very much appreciated and very refreshing.

Kudos to you Mr. Sampson
0
 
LVL 65

Expert Comment

by:RobSampson
ID: 36913229
Cheers.  Thanks for the grade, and the comments.  Glad to help out.

Regards,

Rob.
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Recently I finished a vbscript that I thought I'd share.  It uses a text file with a list of server names to loop through and get various status reports, then writes them all into an Excel file.  Originally it was put together for our Altiris server…
Over the years I have built up my own little library of code snippets that I refer to when programming or writing a script.  Many of these have come from the web or adaptations from snippets I find on the Web.  Periodically I add to them when I come…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now