Thursday, March 27, 2014

SCCM MSI: Could not access network location %APPDATA%\

A very frustrating error when installing the agent. All when you thought that the setup was running fine and easy (for~4000+ clients) some of them just don't get installed! 

So looking at the ccmsetup log, I found out this:

MSI: Could not access network location %APPDATA%\

Resolution, check the registry of each *sob* clients that we're left out. Here's the registry:  

HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

Look for "AppData" and change the value to " %USERPROFILE%\AppData\Roaming"

That's it! Wait for the setup to reinitialize which is about 2 hours. 

Thursday, March 20, 2014

Add Multiple Discovered/Managed Computer to a Collection - SCCM 2007/2012/2012 R2

After doing some research, here's the script I've used to add a list of computers to a certain collection using a batch file. Basically there are three parts of the script:

1. comp.txt - contains the list of computers to be added
2. addcompresid.vbs - contains the script that adds computers to the collection.
3. batch.bat - contains the script to add computers from comp.txt using addcompresid.vbs script.


1. Copy and create (probably from notepad) the batch.bat and addcompresid.vbs
2. Edit Set objSWbemServices= objSWbemLocator.ConnectServer on addcompressid.vbs to specify which MP you are going to connect.
3. Edit Set _COLID on Batch.bat  to specify the collection ID. This can be found on the properties of the collection. 
4. On the same folder, create comp.txt and paste all the computers to be added.

So here's the script and enjoy! 


@echo off
Set _log=AddToCollection.log

echo Starting log file > %_log%

for /f %%a in (comp.txt) do call :AddComp %%a

goto :eof 


cscript //nologo AddCompResID.vbs %1 %_COLID%
Echo. Adding Computer %1 to SCCM CollectionID %_COLID%
Echo. Adding Computer %1 to SCCM CollectionID %_COLID% >> %_log%

goto :eof


strCompName = Wscript.Arguments.Item(0)
strCollID = Wscript.Arguments.Item(1)

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices= objSWbemLocator.ConnectServer("MPSERVER","root\sms")

Set ProviderLoc = objSWbemServices.InstancesOf("SMS_ProviderLocation")
For Each Location In ProviderLoc
    If Location.ProviderForLocalSite = True Then
        Set objSWbemServices = objSWbemLocator.ConnectServer _
            (Location.Machine, "root\sms\site_" + Location.SiteCode)
    End If

Set colCompResourceID = objSWbemServices.ExecQuery("SELECT ResourceID FROM SMS_R_System WHERE " & _
                                              "NetbiosName='" & strCompName & "'")

For each insCompResource in colCompResourceID
 strNewResourceID = insCompResource.ResourceID

Set instColl = objSWbemServices.Get("SMS_Collection.CollectionID=""" & strCollID & """")
Set instDirectRule = objSWbemServices.Get("SMS_CollectionRuleDirect").SpawnInstance_()

instDirectRule.ResourceClassName = "SMS_R_System"
instDirectRule.ResourceID = strNewResourceID
instDirectRule.RuleName = strComputerName
instColl.AddMembershipRule instDirectRule