Link to home
Start Free TrialLog in
Avatar of NetManaged
NetManagedFlag for United States of America

asked on

How do I find and pass dynamic data to other parts of a VBScript?

Hello scripters!

        I am attempting to do the following via VBScript in a TS/RDS Farm:
At logon, find the currently logged on user.
Find the current default printer for that Remote Desktop session.
Pass those variables to other lines later in the VBScript to use a SetACL process.
SetACL line(s):
Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on ""<Discovered TS/RDS session default printer>"" -ot prn -actn ace -ace ""n:<domainnamehere>\<discoveredusernamehere>;p:man_printer""")

Thanks!
Avatar of RobSampson
RobSampson
Flag of Australia image

Hi, this should work when run as the currently logged on user.

Regards,

Rob.
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objScriptExec = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default=True", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
	strPrinter = objItem.Name
Next

Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinter & """ -ot prn -actn ace -ace ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName & ";p:man_printer""")

Open in new window

Avatar of NetManaged

ASKER

Oh my Rob...that looks like what I need!
I never noticed you could use the objNetwork.<something> like that.
What does the "WQL" signify? I'm not familiar with that.
I hope to be able to test this tomorrow, both, as a standalone and to incorporate into the script I am developing.
Thanks!
Greg
WQL stands for Windows Query Language.  It's the language of the queries used for WMI.  It must be specified when the parameters at the end are used.

http://msdn.microsoft.com/en-us/library/aa393866(v=vs.85).aspx

Regards,

Rob.
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objScriptExec = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default=True", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
      strPrinter = objItem.Name

For Each objPrinter in colItems
if inStr(objPrinter.Name,"IMC-FDPtr1") <> 0 Then Call SetIMCFDPTR1
Sub SetIMCFDPTR1
Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinter & """ -ot prn -actn setowner -ownr ""n:" & objNetwork.UserDomain & "\" & 

objNetwork.UserName &";""")
strPrnConfig = objScriptExec.StdOut.ReadAll
'WScript.Echo strPrnConfig
Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinter & """ -ot prn -actn ace -ace ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName & 

";p:man_printer""")
strPrnConfig = objScriptExec.StdOut.ReadAll
'WScript.Echo strPrnConfig
     objPrinter.RenamePrinter("IMCFDPTR1 (2)")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Name = 'IMCFDPTR1 (2)'")
For Each objPrinter in colInstalledPrinters
    objPrinter.SetDefaultPrinter()
Next
end sub
Ahh nuts! Messed up!
The code you supplied works great! I added a line above it to take ownership first then add the manage printers permission.
How do I pass the strings to a Sub later in the script?
I want to pass the printer in the sub.
When I get to Sub SetIMCFDPTR1 I get a general syntax error.
When I run my original script with known values it works.
What am I doing wrong?
Thanks!
Greg
Hi, I don't see your sub in that code, but to pass the string, call
SetIMCFDPTR1 strPrinter

with
Sub SetIMCFDPTR1(strPrinterName)
   WScript.Echo "Printer: " & strPrinterName
End Sub


Regards,

Rob.
Guess, I'm still not doing something right.
I still get a syntax error at the Sub.

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objScriptExec = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default=True", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
	strPrinter = objItem.Name

For Each objPrinter in colItems
  if inStr(objPrinter.Name,"IMC-FDPtr1") <> 0 Then Call SetIMCFDPTR1("strPrinter")

wscript.quit

Sub SetIMCFDPTR1(strPrinterName)
Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinter & """ -ot prn -actn setowner -ownr ""n:" & objNetwork.UserDomain & "\" & 

objNetwork.UserName &";""")
strPrnConfig = objScriptExec.StdOut.ReadAll

Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinter & """ -ot prn -actn ace -ace ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName & 

";p:man_printer""")
strPrnConfig = objScriptExec.StdOut.ReadAll

     objPrinter.RenamePrinter("IMCFDPTR1 (2)")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer Where Name = 'IMCFDPTR1 (2)'")
For Each objPrinter in colInstalledPrinters
    objPrinter.SetDefaultPrinter()
Next
end sub

Open in new window

Hi, very sorry for my delay.  It turns out I was being blind, as your Sub was in the original code. I was also being blind because you have one too many For loops, and no Next statements.  This should work now.

Regards,

Rob.
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objScriptExec = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default=True", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
	If inStr(objItem.Name,"IMC-FDPtr1") <> 0 Then SetIMCFDPTR1 objItem.Name
Next
WScript.Quit

Sub SetIMCFDPTR1(strPrinterName)
	Set objShell = CreateObject("WScript.Shell")
	Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinterName & """ -ot prn -actn setowner -ownr ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName &";""")
	strPrnConfig = objScriptExec.StdOut.ReadAll

	Set objShell = CreateObject("WScript.Shell")
	Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinterName & """ -ot prn -actn ace -ace ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName & ";p:man_printer""")
	strPrnConfig = objScriptExec.StdOut.ReadAll

	objPrinter.RenamePrinter("IMCFDPTR1 (2)")
	strComputer = "."
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
	Set colInstalledPrinters =  objWMIService.ExecQuery("Select * from Win32_Printer Where Name = 'IMCFDPTR1 (2)'")
	For Each objPrinter In colInstalledPrinters
		objPrinter.SetDefaultPrinter()
	Next
End Sub

Open in new window

Hm...getting an error at Line 22, Object required: 'objPrinter'
Wups! Never mind. I figured out what was wrong.
In the code window is the working script. : )
Please look it over for any optimization/clean up you recommend.
If it is good as-is, I will go ahead and award you the points.
ALSO, I have one more aspect to this script I need help on, but I will open another question for it.

Thanks!
Greg
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objScriptExec = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default=True", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
	If inStr(objItem.Name,"IMC-FDPtr1") <> 0 Then SetIMCFDPTR1 objItem.Name
Next
WScript.Quit

Sub SetIMCFDPTR1(strPrinterName)
	Set objShell = CreateObject("WScript.Shell")
	Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinterName & """ -ot prn -actn setowner -ownr ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName &";""")
	strPrnConfig = objScriptExec.StdOut.ReadAll

	Set objShell = CreateObject("WScript.Shell")
	Set objScriptExec = objShell.Exec("C:\Support\SetACL\x64\SetACL.exe -on """ & strPrinterName & """ -ot prn -actn ace -ace ""n:" & objNetwork.UserDomain & "\" & objNetwork.UserName & ";p:man_printer""")
	strPrnConfig = objScriptExec.StdOut.ReadAll

	Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default=True", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
	For Each objPrinter In colItems
	objPrinter.RenamePrinter("IMCFDPTR1 (2)")

	Next

	strComputer = "."
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
	Set colInstalledPrinters =  objWMIService.ExecQuery("Select * from Win32_Printer Where Name = 'IMCFDPTR1 (2)'")
	For Each objPrinter In colInstalledPrinters
		objPrinter.SetDefaultPrinter()
	Next
End Sub

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of RobSampson
RobSampson
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Great. No problem. Thanks for the grade.  I'm glad you were able to make sense of my modifications.

Regards,

Rob.
RobSampson really helped me!