#132532 - 2005-01-17 09:04 AM
VBS to Kix translation
|
Arend_
MM club member
Registered: 2005-01-17
Posts: 1895
Loc: Hilversum, The Netherlands
|
Hi,
I have been trying to translate a VBS script provided by Microsoft for ADsSecurity.dll to Kix but have been unsuccessfull for over a month now. Could anyone help me translating this script: How To Use ADsSecurity.dll to Add an Access Control Entry to an NTFS Folder
At this point I want to thank the board members for providing information about problems. It helped me alot in earlier stages.
|
Top
|
|
|
|
#132534 - 2005-01-17 03:56 PM
Re: VBS to Kix translation
|
Arend_
MM club member
Registered: 2005-01-17
Posts: 1895
Loc: Hilversum, The Netherlands
|
Thats bad news, after months of research this was the only solution I could find that let's me remotely add users to folder rights.
I've made a kix script with a GUI thx to KixForms that let's administrators on our networks create new users but the only thing that isn't working is to set the rights of the profile folder to both the user and administrator as full access. After alot of trial and error eventually I stumbled onto this VBS script and was unsuccesfull translating it to kix. So I came here as a last hope.
Anyway thank you for your quick reply I apreciate it
|
Top
|
|
|
|
#132540 - 2005-01-18 09:19 AM
Re: VBS to Kix translation
|
Anonymous
Anonymous
Unregistered
|
I have been scripting in Kix for over a year now, I know my way around variables and hidden shares they pose no problems, I also tried using cacls, xcacls and the sorts but I need a kix only solution with the exeption of ADsSecutiry.dll which provides the solution, the only thing needed is the code in kix and not vbs. Which is possible I won't stop till I get it working one way or another. I hope you can provide a solution, so far I tranlated it into this part of code: Code:
$sec = CreateObject("ADsSecurity") $textusr = "BLAH\testuser" $userdir = "\\PC-BLAH-XP-4\d$\TEST" $filenm = $userdir $permspart = "add(" + $textusr + ":F)+add(Administrators:F)" ChangeAcls($filenm, $permspart, "EDIT", "FOLDER")
;############################################### Functions ##########################################################
FUNCTION ChangeAcls($file, $perms, $redit, $ffolder) ;- Edit ACLS of specified file ----- $ADS_ACETYPE_ACCESS_ALLOWED = 0 $ADS_ACETYPE_ACCESS_DENIED = 1 $ADS_ACEFLAG_INHERIT_ACE = 2 $ADS_ACEFLAG_SUB_NEW = 9 $sd = $sec.GetSecurityDescriptor("FILE://" + $file) $dacl = $sd.discretionaryacl ;if flagged Replace then remove all existing aces from dacl first IF ucase($redit)="REPLACE" FOR EACH $existingace IN $dacl $dacl.removeace $existingace NEXT ENDIF
;break up Perms into individual actions $cmdarray=split($perms,"+")
FOR x=0 TO ubound($cmdarray) $tmpvar1=$cmdarray(x) IF ucase(left($tmpvar1,3))="DEL" $aclaction="DEL" ELSE $aclaction="ADD" ENDIF
$tmpcmdvar=left($tmpvar1,len($tmpvar1)-1) $tmpcmdvar=right($tmpcmdvar,len($tmpcmdvar)-4) $cmdparts=split($tmpcmdvar,":") $namevar=$cmdparts(0) $rightvar=$cmdparts(1)
; if flagged edit, delete ACE;s belonging to user about to add an ace for
IF ucase($redit)="EDIT" FOR EACH $existingAce IN $dacl $trusteevar=$existingAce.trustee IF instr($trusteeVar,"\") $trunamevar=right($trusteevar,len($trusteevar)-instr($trusteevar,"\")) ELSE $trunamevar=$trusteevar ENDIF
$uctrunamevar=ucase($trunamevar) $ucnamevar=ucase($namevar)
IF $uctrunamevar=$ucnamevar $dacl.removeace $existingace ENDIF NEXT ENDIF ; if action is to del ace then following clause skips addace IF $aclaction="ADD" IF ucase($ffolder)="FOLDER" ; folders require 2 aces for user (to do with inheritance) addace $dacl, $namevar, $rightvar, ADS_ACETYPE_ACCESS_ALLOWED, ADS_ACEFLAG_SUB_NEW addace $dacl, $namevar, $rightvar, ADS_ACETYPE_ACCESS_ALLOWED, ADS_ACEFLAG_INHERIT_ACE ELSE addace $dacl, $namevar, $rightvar, ADS_ACETYPE_ACCESS_ALLOWED,0 ENDIF ENDIF NEXT
FOR EACH $ace IN $dacl ; for some reason if ace includes "NT AUTHORITY" then existing ace does not get readded to dacl
IF instr(ucase($ace.trustee),"NT AUTHORITY\") $newtrustee=right($ace.trustee, len($ace.trustee)-instr($ace.trustee, "\")) $ace.trustee=newtrustee ENDIF NEXT
; final sets and cleanup $sd.discretionaryacl = $dacl $sec.setsecuritydescriptor $sd $sd=nothing $dacl=nothing $sec=nothing ENDFUNCTION
FUNCTION addace($dacl, $trustee, $maskvar, $acetype, $aceflags) ; add ace to the specified dacl Const RIGHT_READ = &H80000000 Const RIGHT_EXECUTE = &H20000000 Const RIGHT_WRITE = &H40000000 Const RIGHT_DELETE = &H10000 Const RIGHT_FULL = &H10000000 Const RIGHT_CHANGE_PERMS = &H40000 Const RIGHT_TAKE_OWNERSHIP = &H80000
$ace = CreateObject("AccessControlEntry") $ace.trustee = $trustee
SELECT CASE ucase($maskvar) ; specified rights so far only include FC & R. Could be expanded though CASE "F" $ace.accessmask = RIGHT_FULL CASE "C" $ace.accessmask = RIGHT_READ OR RIGHT_WRITE OR RIGHT_EXECUTE OR RIGHT_DELETE CASE "R" $ace.accessmask = RIGHT_READ OR RIGHT_EXECUTE ENDSELECT
$ace.acetype = $acetype $ace.aceflags = $aceflags $dacl.addace $ace $ace=nothing ENDFUNCTION
But gets stuck in ubound
|
Top
|
|
|
|
#132542 - 2005-01-18 07:26 PM
Re: VBS to Kix translation
|
Arend_
MM club member
Registered: 2005-01-17
Posts: 1895
Loc: Hilversum, The Netherlands
|
This is the last I can make of it, I get no error returns anymore but it doesn't work either :/
If anyone can take a look at it I'd apreciate it.
Code:
$ofs = CreateObject("Scripting.FileSystemObject")
$sec = CreateObject("ADsSecurity")
$textusr = "BLAH\testuser"
$userdir = "\\PC-BLAH-XP-4\d$\TEST"
$filenm = $userdir
$permspart = "add(" + $textusr + ":E)+add(Administrators:F)"
;-- Replace ACL on single file or folder-------
ChangeAcls($filenm, $permspart, "EDIT", "FOLDER")
; $ofs=nothing
;############################################### Functions ##########################################################
FUNCTION ChangeAcls($file, $perms, $redit, $ffolder)
;- Edit ACLS of specified file -----
$ADS_ACETYPE_ACCESS_ALLOWED = "0"
$ADS_ACETYPE_ACCESS_DENIED = "1"
$ADS_ACEFLAG_INHERIT_ACE = "2"
$ADS_ACEFLAG_SUB_NEW = "9"
$sd = $sec.GetSecurityDescriptor("FILE://" + $file)
$dacl = $sd.discretionaryacl
;if flagged Replace then remove all existing aces from dacl first
IF ucase($redit)="REPLACE"
FOR EACH $existingace IN $dacl
$dacl.removeace($existingace)
NEXT
ENDIF
;break up Perms into individual actions
$cmdarray=split($perms,"+")
For $x = 0 to Ubound($cmdarray)
$tmpvar1=$cmdarray[$x]
IF ucase(left($tmpvar1,3))="DEL"
$aclaction="DEL"
ELSE
$aclaction="ADD"
EndIf
$tmpcmdvar=left($tmpvar1,len($tmpvar1)-1)
$tmpcmdvar=right($tmpcmdvar,len($tmpcmdvar)-4)
$cmdparts=split($tmpcmdvar,":")
$namevar=$cmdparts[0]
$rightvar=$cmdparts[1]
; if flagged edit, delete ACE's belonging to user about to add an ace for
IF ucase($redit)="EDIT"
FOR EACH $existingAce IN $dacl
$trusteevar=$existingAce.trustee
IF instr($trusteeVar,"\")
$trunamevar=right($trusteevar,len($trusteevar)-instr($trusteevar,"\"))
ELSE
$trunamevar=$trusteevar
ENDIF
$uctrunamevar=ucase($trunamevar)
$ucnamevar=ucase($namevar)
IF $uctrunamevar=$ucnamevar
$dacl.removeace($existingace)
ENDIF
NEXT
ENDIF
; if action is to del ace then following clause skips addace
IF $aclaction="ADD"
IF ucase($ffolder)="FOLDER"
; folders require 2 aces for user (to do with inheritance)
addace($dacl, $namevar, $rightvar, $ADS_ACETYPE_ACCESS_ALLOWED, $ADS_ACEFLAG_SUB_NEW)
addace($dacl, $namevar, $rightvar, $ADS_ACETYPE_ACCESS_ALLOWED, $ADS_ACEFLAG_INHERIT_ACE)
ELSE
addace($dacl, $namevar, $rightvar, $ADS_ACETYPE_ACCESS_ALLOWED, "0")
ENDIF
ENDIF
NEXT
FOR EACH $ace IN $dacl
; for some reason if ace includes "NT AUTHORITY" then existing ace does not get readded to dacl
IF instr(ucase($ace.trustee),"NT AUTHORITY\")
$newtrustee=right($ace.trustee, len($ace.trustee)-instr($ace.trustee,"\"))
$ace.trustee=newtrustee
ENDIF
NEXT
ENDFUNCTION
FUNCTION addace($dacl, $trustee, $maskvar, $acetype, $aceflags)
; add ace to the specified dacl
$RIGHT_READ = +H80000000
$RIGHT_EXECUTE = +H20000000
$RIGHT_WRITE = +H40000000
$RIGHT_DELETE = +H10000
$RIGHT_FULL = +H10000000
$RIGHT_CHANGE_PERMS = +H40000
$RIGHT_TAKE_OWNERSHIP = +H80000
$ace = CreateObject("AccessControlEntry")
$ace.trustee = $trustee
$case = ucase($maskvar)
SELECT
CASE ($case = "F")
$ace.accessmask = $RIGHT_FULL
CASE ($case = "C")
$ace.accessmask = $RIGHT_READ OR $RIGHT_WRITE OR $RIGHT_EXECUTE OR $RIGHT_DELETE
CASE ($case = "R")
$ace.accessmask = $RIGHT_READ OR $RIGHT_EXECUTE
CASE ($case = "E")
$ace.accessmask = $RIGHT_EXECUTE
ENDSELECT
$ace.acetype = $acetype
$ace.aceflags = $aceflags
$dacl.addace($ace.trustee)
ENDFUNCTION
|
Top
|
|
|
|
#132543 - 2005-01-18 08:42 PM
Re: VBS to Kix translation
|
Allen
KiX Supporter
Registered: 2003-04-19
Posts: 4549
Loc: USA
|
I have not tried your code, and am certainly not a expert when it comes to HEX and bitwise code... but I think I see some things that may help... I'm sure others around here could verify this better than I.
No need for the quotes around the numbers: Code:
$ADS_ACETYPE_ACCESS_ALLOWED = "0" $ADS_ACETYPE_ACCESS_DENIED = "1" $ADS_ACEFLAG_INHERIT_ACE = "2" $ADS_ACEFLAG_SUB_NEW = "9"
If these are HEX values shouldn't they be like $hex=&H0000 Code:
$RIGHT_READ = +H80000000 $RIGHT_EXECUTE = +H20000000 $RIGHT_WRITE = +H40000000 $RIGHT_DELETE = +H10000 $RIGHT_FULL = +H10000000 $RIGHT_CHANGE_PERMS = +H40000 $RIGHT_TAKE_OWNERSHIP = +H80000
Shouldn't the code below be using "|" instead of OR Code:
CASE ($case = "C") $ace.accessmask = $RIGHT_READ OR $RIGHT_WRITE OR $RIGHT_EXECUTE OR $RIGHT_DELETE CASE ($case = "R") $ace.accessmask = $RIGHT_READ OR $RIGHT_EXECUTE
Hope this helps.
|
Top
|
|
|
|
#132544 - 2005-01-19 10:55 AM
Re: VBS to Kix translation
|
Arend_
MM club member
Registered: 2005-01-17
Posts: 1895
Loc: Hilversum, The Netherlands
|
ok I changed that part but still no dice, I have to put the hex values in quotation marks else I get error in expression stuff.
Code:
$RIGHT_READ = "&H80000000"
$RIGHT_EXECUTE = "&H20000000"
$RIGHT_WRITE = "&H40000000"
$RIGHT_DELETE = "&H10000"
$RIGHT_FULL = "&H10000000"
$RIGHT_CHANGE_PERMS = "&H40000"
$RIGHT_TAKE_OWNERSHIP = "&H80000"
Also changed the OR to |.
|
Top
|
|
|
|
#132545 - 2005-01-19 11:03 AM
Re: VBS to Kix translation
|
Richard H.
Administrator
Registered: 2000-01-24
Posts: 4946
Loc: Leatherhead, Surrey, UK
|
Drop the 'H': Code:
$RIGHT_READ = &80000000 $RIGHT_EXECUTE = &20000000 $RIGHT_WRITE = &40000000 $RIGHT_DELETE = &10000 $RIGHT_FULL = &10000000 $RIGHT_CHANGE_PERMS = &40000 $RIGHT_TAKE_OWNERSHIP = &80000
|
Top
|
|
|
|
#132548 - 2005-01-19 05:05 PM
Re: VBS to Kix translation
|
Arend_
MM club member
Registered: 2005-01-17
Posts: 1895
Loc: Hilversum, The Netherlands
|
You are right about the "H" thing, the &80000 values are resolved ok to Hex values. Thanks for that
The script now works without errors, however it doesn't set the permissions still :/
|
Top
|
|
|
|
#132551 - 2005-01-19 06:08 PM
Re: VBS to Kix translation
|
Richard H.
Administrator
Registered: 2000-01-24
Posts: 4946
Loc: Leatherhead, Surrey, UK
|
Well, I've added some debug statements and at this point in your ChangeACLS function: Code:
udfDEBUG("About to GetSecurityDescriptor") $sd = $sec.GetSecurityDescriptor("FILE://" + $file) If @ERROR "Failed to get DACL" Exit @ERROR EndIf udfDEBUG("Past GetSecurityDescriptor")
I get the "About to GetSecurityDescriptor" message, but then nothing. KiXtart exits in the GetSecurityDescriptor call with no error message.
|
Top
|
|
|
|
Moderator: Jochen, Allen, Radimus, Glenn Barnas, ShaneEP, Ruud van Velsen, Arend_, Mart
|
0 registered
and 369 anonymous users online.
|
|
|