dsmod bug when using the –c option?
UPDATE: thanks to some anonymous commenters, i have corrected my example in this post. it seems i left off the trailing %a in the for loop! oops. fixed now.
i was visiting up in roanoke extolling about the boundless possibilities with command shells, scripting, etc to a near liability. in other words, i bored them nearly to death. :)
to my surprise, it stuck. i’ve been exchanging conversation with one of the site admins and ran across this bug while running through a sample scenario on listing members from one group and adding them to another. typically, you could do this quite easily with the dsquery tool set.
it looks something like this:
dsquery group -name "myGroup" | dsget group -members | dsmod group "cn=myNewGroup,ou=etc,dc=etc,dc=etc" -addmbr –c
- dsquery group –name “myGroup” – retrieves the dn of the group
- dsget group –members – retrieves the membership list (dn) of the group passed through the pipe
- dsmod group “cn=mynewgroup…” –addmbr –c – adds the members of the previous group into specified group.
this works fine as long as there are no conflicts. if you run into conflicts, the process bombs out with this error:
dsmod failed:CN=myNewGroup...:The specified account name is already a member of the local group.
for /f "delims=" %a in ('dsquery group -name "myGroup" ^| dsget group -members') do dsmod group "cn=myNewGroup..." –addmbr %a
- for /f “delims” %a in (‘dsquery…’) – retrieves the membership list of the group and assigns them as a token value of %a
- dsmod group “cn=myNewGroup…” –addmbr – for each member, we’re adding them individually to the group.
in this case, even if we run into failures, it doesn’t matter since we’re kicking off dsmod as separate commands each time.
and of course, to do this in powershell, you’d execute a command like this:
Get-QADGroupMember "myGroupName" | foreach {Add-QADGroupMember -identity "CN=myNewGroup..." -member $_}
hanks for the article... it helped me a lot!
ReplyDeleteIs that ^ realy needed before the | character?
in the example above, yes. the reason being, anytime you have something going through a pipe, a carat is required to indicate to the FOR dos command that you are not trying to pass everything to the left of it into that pipe. this will cause the portion in parenthesis to execute w/ pipe intact. :)
ReplyDeleteIs this possible to do with active domain OU user export?
ReplyDeleteExample:
dsquery user ou=Marketing,dc=microsoft,dc=com | dsmod group "cn=Marketing Staff,ou=Marketing,dc=microsoft,dc=com" -addmbr -c
(as you stated -c option is no good and if user already exist in given group command just stops)
When I add this to your for /f example
for /f "delims=" %a in ('dsquery user ou=Marketing,dc=microsoft,dc=com') do dsmod group "cn=Marketing Staff,ou=Marketing,dc=microsoft,dc=com" -addmbr
Nothing happens :( -> what am I doing wrong here?
Thanks
re: comment on 3/23/11 - I had that problem too and found I needed to add the %a to the end of the statement: ... -addmbr %a
ReplyDeleteso that it knows what to "do" against.
sorry about that guys. i think you're absolutely right. i forgot to add the %a in my example above. i'll get it corrected.
ReplyDelete