The success of PowerShell is firmly rooted in strong community involvement and the willingness of people to share their knowledge about how to get things done. This has been the case for as long as I have worked with PowerShell (starting with Exchange 2007 in late 2006). I learned from many and gradually moved from total novice status to become mildly competent. Some would say dangerously incompetent, but that’s another discussion.
Part of being in a community is acknowledgement of the work you reuse from others. If you find some useful code in a script written by someone else, incorporate the code into your script and include an acknowledgement of where the code came from. It’s simply being polite.
Seeing the post in the Facebook PowerShell group, I opened the link to read the article to discover that much of the code in the script was lifted from my script posted in GitHub. No attempt was made to hide the source of many lines of code, which was copied and dropped into the Office 365 Reports script. Even the most cursory of examinations reveals the extent of the copying.
It’s true that the Office 365 Reports version uses the Microsoft Graph PowerShell SDK where I use an Azure AD registered app as the source of authentication to access the data held in room mailbox calendars, but look beyond that to the output and you’ll see where the copying happened. Figure 2 shows a screen shot published in my February 2023 article. Look at the summary for individual room mailbox statistics. Doesn’t that look very similar to the output generated by the Office 365 Reports version?
Figure 2: Example output from the Room mailbox reporting script
Any PowerShell script might produce rudimentary output that looks similar to other scripts. But if you examine their script, you’ll find many matches with the original code. In short, Office 365 Reports were lazy and copied code without bothering to hide their traces.
Poor Behavior From a Commercial Company
I have a real problem with this behavior. First, no one from Office 365 Reports (or AdminDroid, their associated company) contacted me to ask if they could reuse my code. Instead, Office 365 Reports went ahead and copied many lines of code (including a bug that I subsequently fixed) from GitHub and published their script. They didn’t bother responding to the comment I made to their Facebook post either.
Second, they didn’t bother to acknowledge the original source of much of the code in their script. I did not grant Office 365 Reports the right to reuse my code for commercial purposes, which is what they have done by including the code in a script developed to attract interest in Office 365 Reports and AdminDroid.
Plagiarism is Never Justified
I don’t like slamming companies in public, but I hate when companies like AdminDroid seek to benefit from the work shared freely within the PowerShell community. My suspicion is that this is not the first time that Office 365 Reports and AdminDroid have “borrowed” code from the PowerShell community to advance their commercial interests. I also don’t like the way that they post articles under assumed names like Kathy Cooper. I don’t believe that such a person exists. It’s just a nom de plume used to disguise whoever writes the articles.
If the people behind AdminDroid and Office 365 Reports want to contact me, I’m happy to hear their side of the argument. But right now this looks like a simple case of plagiarism. If that’s the way AdminDroid operates, why would anyone use their products?
Hi Tony,
I’m right there with you! If someone makes an effort and shares it with the community and it is then used further, then they should have balls in their pants and ask the publisher.
But that shows that they benefit from the best of the best!!
In my opinion such behavior is the first step to ruin what you’ve rightly called ‘community values’.
I’m always surprised how difficult it is for some to predict the not-so-far-reaching consequences of such approach.
I apologize for your code being used in our blog without notice. It passed our review without our knowledge unless pointed out by you.
Here’s a little bit of background of what has happened.
Before jumping into details, I would like to provide a brief on our team: We have been preparing Microsoft 365 PowerShell scripts for years, considering real-time use cases which include advanced capabilities like built-in filtering, scheduling, automatically installing required modules, etc. Each script is full blown script which supports variety of use cases.
Upon being assigning a fresh script task, the intern inadvertently took a reference from the internet unaware of the nature of the task being assigned, and proceeded with converting to Graph PowerShell, which you can clearly notice as none of your code is modified except connecting methodology alone. The same was overlooked in our review as well.
https://o365reports.com/2019/05/23/export-office-365-distribution-group-members-csv/ – When you check our blogs and their comments, you will get to know how we craft each script, how we enhance them based on our readers’ requirements, and how we actively respond to community questions for our script. It’s really disheartening to hear criticism after putting in a year’s worth of effort.
We assure all of our existing scripts are written from scratch by understanding various use cases of admin requirements. However, we take full responsibility for the review error. Again, I apologize for the incident and the pain it has caused you. We never want to hurt anyone and copy their works, so we request you to allow us a few days for us to redo the code and update our blog. We respect your contribution towards the Office 365 community, and your understanding in this matter.
I don’t quite know how to respond. You put all the blame on the person who plagiarized my code and the failure of your review process. Yet no blame is assigned to the obvious problem that exists within the organization where interns are assigned tasks to write PowerShell scripts without sufficient guidance or oversight. In fact, the knowledge that you use interns to write code is pretty interesting because it means that the code generated lacks any of the wisdom or insight gained through hard experience of using Microsoft 365. Writing code based on theory rather than practice is fine and value exists in that approach, but practice makes perfect (or at least as close to perfect as anyone can get).
It seems to me that Office 365 Reports/AdminDroid ignored the original protest I posted in response to the Facebook post about your script. Perhaps you wanted me to go away and accept that plagiarism can be tolerated and that companies like yours can make a commercial gain from the efforts of others. It strongly seems that you only swung into action to response after experiencing an “oh crap” moment when you realized that I had published an article outlining the facts.
I hope that your company learns from the experience and responds quickly to any issue highlighted to you in whatever social media channels you use to publish material. The pain of making a mistake is much reduced when you address it fast. I would have been happy with an acknowledgement of the mistake, but once you ignored me, the likelihood of action resulting in a loss of reputation increased dramatically, as I think you discovered.
I personally don’t care what you do to adjust your code or your blog post. I will never recommend your company to any potential customer in the future.
I’ve addressed the obvious issue we’ve been discussing. However, I see that I did not explicitly state it in my previous response, and some clarity was lacking there.
We always ensure having a strong tech mentor when an intern prepares a script; Knowledge from mentor, script by intern and reviewed by coding expert. Our reviewer certainly checked the script’s effectiveness but overlooked plagiarism; yeah, I admit it, even if it is unintentional. We are to blame for failing to notice this. We accept it as a mistake on our part and we will work to prevent it from happening again. I also understand that our response to the social media comment you made was delayed. We really missed noticing the comment you made; it came to my notice only after I had been tagged. I deeply regret for inadvertently hurting you. Now I have written the script and updated it in the blog.
Please don’t overlook the quality as the recent scripts were updated by an intern. If you have any point in our script quality, then we are happy to participate in healthy discussion which would benefit the entire community.
I want to clearly convey that we are strictly against plagiarism. We are writing scripts for the Office 365 Administrators, and we are getting good responses from them, and they are motivating us to write more blogs. All our code is well maintained to tackle the many changes that have been happening in the Microsoft 365 ecosystem. We do this because we love to be a part of the Microsoft 365 community and want to extend our knowledge and resources to all Administrators and be a part of their daily life.
I hope we can allow this conversation to rest. I appreciate the lessons I’ve learned from our interactions.
Loading...
I am going to continue to purchase your book and subscribe to your newsletter. I will also continue to recommend your invaluable resources to my clients,
I will be avoiding the AdminDroid and Office365 reports content and will advise my clients to do the same.
It is always the same, many people are copying content without adding links, asking for consent or adding credits and if someone reports that, then they may say sorry or tell us that it is not the companies fault or not “for business” etc. I see that many times with my content, too and i believe that it will even get worse with KI-generated answers in search engines without pointing to sources.
I know, i have many “unique” typos in my content and code and you might find duplicates.
Even some pages are using IMG-Links to include my pictures in their web (check the referer in the Logs)
But there is no solution for that. People are always copying (all nations, not a chinese only issue) and some earn money with them. I have seen “Customers documentations” from competitors with my images and text (and typo!) as a paid service at the customer.
The only thing you can do: make it public, tell it your customer and community, so they can make their own decisions.
ATTENTION: Don’t use the above websites. Keep in mind that you do NOT support them, click on the posts, or engage with them.
I never ever used their products and never will share their posts or scripts.
Now with you confirming their bad behavior, hopefully all people around the world understand this too and stop using or recommending their product (if they ever did).
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
Hi Tony,
I’m right there with you! If someone makes an effort and shares it with the community and it is then used further, then they should have balls in their pants and ask the publisher.
But that shows that they benefit from the best of the best!!
Thanks for your daily great work!
Marc
In my opinion such behavior is the first step to ruin what you’ve rightly called ‘community values’.
I’m always surprised how difficult it is for some to predict the not-so-far-reaching consequences of such approach.
I apologize for your code being used in our blog without notice. It passed our review without our knowledge unless pointed out by you.
Here’s a little bit of background of what has happened.
Before jumping into details, I would like to provide a brief on our team: We have been preparing Microsoft 365 PowerShell scripts for years, considering real-time use cases which include advanced capabilities like built-in filtering, scheduling, automatically installing required modules, etc. Each script is full blown script which supports variety of use cases.
You can check our GitHub script repository: https://github.com/admindroid-community/powershell-scripts (65 scripts are available)
Now, coming to the current situation, as the Azure AD and MSOnline modules are being deprecated, our new interns have been working on converting our existing scripts to Microsoft Graph PowerShell. I’m including the below links as proof of the conversion process in the recent time for converting the scripts from 2018.
May 4, 2023: https://o365reports.com/2019/03/07/export-office-365-users-last-logon-time-csv/
Apr 21, 2023: https://o365reports.com/2020/11/12/export-office-365-guest-user-report-with-their-membership/
Apr 14,2023: https://o365reports.com/2020/02/17/export-office-365-users-last-password-change-date-to-csv/
Apr 08, 2023: https://o365reports.com/2021/04/15/export-office-365-groups-a-user-is-member-of-using-powershell
Mar 30, 2023: https://o365reports.com/2018/12/14/export-office-365-user-license-report-powershell/
Mar 23, 2023: https://o365reports.com/2021/03/02/export-office-365-admin-role-report-powershell
Mar 16, 2023: https://o365reports.com/2021/02/11/export-microsoft-365-group-report-to-csv-using-powershell/
Upon being assigning a fresh script task, the intern inadvertently took a reference from the internet unaware of the nature of the task being assigned, and proceeded with converting to Graph PowerShell, which you can clearly notice as none of your code is modified except connecting methodology alone. The same was overlooked in our review as well.
https://o365reports.com/2019/05/23/export-office-365-distribution-group-members-csv/ – When you check our blogs and their comments, you will get to know how we craft each script, how we enhance them based on our readers’ requirements, and how we actively respond to community questions for our script. It’s really disheartening to hear criticism after putting in a year’s worth of effort.
We assure all of our existing scripts are written from scratch by understanding various use cases of admin requirements. However, we take full responsibility for the review error. Again, I apologize for the incident and the pain it has caused you. We never want to hurt anyone and copy their works, so we request you to allow us a few days for us to redo the code and update our blog. We respect your contribution towards the Office 365 community, and your understanding in this matter.
Kathy,
I don’t quite know how to respond. You put all the blame on the person who plagiarized my code and the failure of your review process. Yet no blame is assigned to the obvious problem that exists within the organization where interns are assigned tasks to write PowerShell scripts without sufficient guidance or oversight. In fact, the knowledge that you use interns to write code is pretty interesting because it means that the code generated lacks any of the wisdom or insight gained through hard experience of using Microsoft 365. Writing code based on theory rather than practice is fine and value exists in that approach, but practice makes perfect (or at least as close to perfect as anyone can get).
It seems to me that Office 365 Reports/AdminDroid ignored the original protest I posted in response to the Facebook post about your script. Perhaps you wanted me to go away and accept that plagiarism can be tolerated and that companies like yours can make a commercial gain from the efforts of others. It strongly seems that you only swung into action to response after experiencing an “oh crap” moment when you realized that I had published an article outlining the facts.
I hope that your company learns from the experience and responds quickly to any issue highlighted to you in whatever social media channels you use to publish material. The pain of making a mistake is much reduced when you address it fast. I would have been happy with an acknowledgement of the mistake, but once you ignored me, the likelihood of action resulting in a loss of reputation increased dramatically, as I think you discovered.
I personally don’t care what you do to adjust your code or your blog post. I will never recommend your company to any potential customer in the future.
Tony
I’ve addressed the obvious issue we’ve been discussing. However, I see that I did not explicitly state it in my previous response, and some clarity was lacking there.
We always ensure having a strong tech mentor when an intern prepares a script; Knowledge from mentor, script by intern and reviewed by coding expert. Our reviewer certainly checked the script’s effectiveness but overlooked plagiarism; yeah, I admit it, even if it is unintentional. We are to blame for failing to notice this. We accept it as a mistake on our part and we will work to prevent it from happening again. I also understand that our response to the social media comment you made was delayed. We really missed noticing the comment you made; it came to my notice only after I had been tagged. I deeply regret for inadvertently hurting you. Now I have written the script and updated it in the blog.
Please don’t overlook the quality as the recent scripts were updated by an intern. If you have any point in our script quality, then we are happy to participate in healthy discussion which would benefit the entire community.
I want to clearly convey that we are strictly against plagiarism. We are writing scripts for the Office 365 Administrators, and we are getting good responses from them, and they are motivating us to write more blogs. All our code is well maintained to tackle the many changes that have been happening in the Microsoft 365 ecosystem. We do this because we love to be a part of the Microsoft 365 community and want to extend our knowledge and resources to all Administrators and be a part of their daily life.
I hope we can allow this conversation to rest. I appreciate the lessons I’ve learned from our interactions.
I am going to continue to purchase your book and subscribe to your newsletter. I will also continue to recommend your invaluable resources to my clients,
I will be avoiding the AdminDroid and Office365 reports content and will advise my clients to do the same.
Funny that there’s no “Kathy Cooper” associated with AdminDroid on LinkedIn.
It is always the same, many people are copying content without adding links, asking for consent or adding credits and if someone reports that, then they may say sorry or tell us that it is not the companies fault or not “for business” etc. I see that many times with my content, too and i believe that it will even get worse with KI-generated answers in search engines without pointing to sources.
I know, i have many “unique” typos in my content and code and you might find duplicates.
Even some pages are using IMG-Links to include my pictures in their web (check the referer in the Logs)
But there is no solution for that. People are always copying (all nations, not a chinese only issue) and some earn money with them. I have seen “Customers documentations” from competitors with my images and text (and typo!) as a paid service at the customer.
The only thing you can do: make it public, tell it your customer and community, so they can make their own decisions.
“Kathy” ‘s English comes across as AI generated, or at least not English as their first language.
Hi Tony,
Great article and I can 100% agree with you.
It’s a shame that AdminDroid did this. It’s not the first time they do this. They just have to STOP!
There is no “Kathy Cooper” and it’s just an Indian company that like to steal/copy information.
They run:
– Admindroid.com
– O365reports.com
– M365scripts.com
ATTENTION: Don’t use the above websites. Keep in mind that you do NOT support them, click on the posts, or engage with them.
I never ever used their products and never will share their posts or scripts.
Now with you confirming their bad behavior, hopefully all people around the world understand this too and stop using or recommending their product (if they ever did).
Keep being you, Tony.