by David | Jul 10, 2023 | Blog, Mental Health
That’s right, you Don’t Need Superpowers. Today I bring you a blog post near and dear to my heart. I grew up reading DC and Marvel comic books. Watching Superhero tv shows and movies. The idea that someone could fly, and run faster than a speeding bullet was amazing. I personally loved how Batman was human, but he was able to beat even the biggest and most powerful villain. Every one of these characters had one thing in common. They were more than human. More than me.
I grew up in an environment that told me I could never measure up. My parents trained me on how to fail standardized testing. I also experienced a lot of physical abuse growing up. At an early age, I was told that Creator God, the most powerful being in all existence, hated me from birth because of what someone else did and that I would suffer in extreme pain forever. I believed this for most of my life. Only more recently did I learn, You Don’t Need Superpowers.
Shame
At the core of my upbringing, I was taught my parent’s shame cycles. I believed that I was less than and I needed to work to be more. I was raised in the upper-lower class. In school, I was taught that hard work made good things happen to you. The harder you worked, the better your life would be. I was also taught in school that I was dumber than others. This created a lot of Shame inside of me. It was painful to look in the mirror.
The Split
What do you do when you look in the mirror and see a monster? Let’s rephrase the question. What do you do when you are walking down the street and you see a crazed gunman shooting at people? I personally would run away and get help. I know my limits. So, when you see yourself in the mirror and see a monster, most people run. How do you run away from yourself tho?
This is where the split comes into play. It’s easier to create an object and live with that than to live with the monster. It would be easier to have the crazed gunman as a statue in your living room instead of having the gunman in your house shooting it up. This is the same way we treat ourselves. This could look different from person to person.
This split creates an alienation inside yourself. Let’s take a look at Frank’s life for a second. Frank grew up in a very traditional home. Showing any form of extreme emotions was frowned upon. As a man, Frank was to be in complete control of his emotions at all times like his father and grandfather. If he received punishment, if he expressed any emotions, the punishments would last longer. Fast forward a few decades. Frank is now a dad of 3 girls. Every time his girls express emotions, Frank immediately feels out of place. He starts to feel two ways, his daughters are broken and he was broken for feeling like this. This part of him is alienated from himself. He projects this part of himself in every relationship He is in.
Greater Than Vs Less Than
These exposures to our ugly statues; our shamed self is painful. There are many things people do to escape this hurt. In the end, this statue of self is either less than or more than human. Here are some examples of less than:
- A slob
- Family Scapegoat
- Alcoholic
Here are some examples of more than:
- Perfectionist
- Family Hero
- Celibate false man of God
As time moves on, these lies become truths in people’s lives. I believed the lies and became both the family scapegoat and the family hero. The less than makes me wormlike while the greater than disables my will, or grandiosity, bigger than life. This is where the need for superpowers comes into play.
Why did I want superpowers?
Looking back at my childhood, I can see why I was drawn to comic books. I was taught I was born less than everyone else. I believed I had to work hard for anyone to even notice me. As the middle boy, this was partially true. If I had superpowers people would notice me. In the comics, people would look up at Superman as he flew over. All eyes were on his greatness, not his weakness. Only the bad guys saw Superman’s weakness to Kryptonite. I wanted that power. The power for people to notice greatness beyond any other human standards. I knew I couldn’t be Superman, but that didn’t stop me from trying.
The will wills what can’t be willed.Healing the shame that binds you - John Bradshaw
I am a product of this will wanting to will what cant be will and an idea of being wormlike or less than. The feeling of being wormlike was always painful and I wanted to escape at all costs. I studied magic, body language, emotional intelligence, and more. If I could see the bad coming, I would be able to handle it. I didn’t have to fear the boot of people stepping on me like a warm.
This concept bled into my work life. I would work extra hard without breaks and go much longer than others. I was called upon to complete work others would never do, couldn’t do, or will not do. A backup battery landed on my leg at my first IT job damaging my back. I didn’t take care of my back, and now I suffer. I had to prove my worth more than taking care of myself.
Why You Don’t Need Superpowers
Our Culture tells us, to work harder and get more rewards. This culture tells us we are bad (ineffective) if we don’t perform at our peak potential at all times. This concept repeats itself from generation to generation. The need to control has been present since the dawn of man. The act of using shame to control others is nothing new. This need to control is, in of itself, a form of shame.
You are Human
The truth is You Are Human. You have limits. Being human means, you have limits. Over the years, Superman went from jumping tall buildings to flying. He struggled with electricity. He also struggled with limits that were realistic. As the character developed, the need to be more and more grew. This was people’s need to feel like they were more than their limits. To make Superman more relatable, DC comics gave him a weakness of kryptonite. They gave him a limit because he reached a point where he was no longer relatable.
Don’t be Superman
See, we are not Superman, and let’s face it, we will never be. That’s a beautiful thing. Think about life being perfect and all-powerful, that would be boring. There is a real need for community. This need is because we all have different limits and skills. It’s beautiful and OK. I have no hands-on skills when it comes to doing any kind of repair work in my house. However, I am good with technology. I can sit here and tell myself, I am weak for not being able to patch the hole in my ceiling by myself, or I can speak with friends and family who can. By asking for help, I show my strength of being human. Its OK.
I recently heard an analogy about if everyone dug a ditch together for water in the same space, all we would have is a big hole and lots of hurt feelings. However, if everyone dug in their respective spaces, we would have a ditch big enough for water to flow.
Culture
Our culture tells us to run on all cylinders. Learn everything that ever was and even more. The thing about these concepts is they are impossible. These things are not human. Like myself, I hurt my back by picking up a heavy backup battery. I was trying to be more than my limits because that is what I believed I should be.
A young man recently told me he was struggling to learn every programming language for a potential programming job. It takes time to learn a language. It’s impossible to learn them all. This is what he was trying to do. He was led to believe, the more programming languages he knew, the more jobs he will get. Of course, this is a lie. The truth is, the more programming languages you learn well, opens more doors. The key is well. It’s impossible to learn all programming languages, so how would you learn them well?
It’s ok not to know everything. That’s simply impossible. It’s ok to take breaks and not push at 100% at all times. That’s how burnout happens. Did you know that the majority of millennials are burned out? Suicide rates have greatly increased in the past 20 years. Mental health issues keep climbing. A large percentage of Americans are on anti-depressants. All of this is because culture teaches us we have to be more than human or we are trash.
Breaking Free
Know yourself
How do we break free? The first step would be to realize you have a limit. Discover what those limits are. If you can’t seem to study for 7 hours at a clip, then don’t. Find a healthy threshold and do that. Respect your limits. There is nothing wrong with them.
Knowing yourself is the beginning of all wisdom.Aristotle
Boundaries
The next step is to set boundaries for yourself and others. I grew up believing that if you had boundaries, you didn’t love anyone. This translated to being a bad person. It wasn’t until later did I realize this was a lie to control me. Think of boundaries like doors. Do you want strangers in your home when you are not there? I don’t. The door is a boundary. The lock is you inforcing that boundary. The door is a good way to keep danger at bay. So are boundaries you set in your life.
Ever had a job that worked you 60 hours a week, but only paid for 40? That’s a boundary problem. This behavior is a refusal to respect you. At a previous job, I was expected to take on all the coding, the helpdesk, and projects all at the same time without the access needed to complete these tasks. I often found myself working 60 hours because I didn’t respect my time or my family. My boundaries were weak.
Breaking the statues
Those statues you have all over the place. Aspects you have frozen and beaten down over the years. Those aspects of yourself live inside those statues. You didn’t kill them. They are still there. It’s time to smash those statues and let those parts of you out. See them, address them, know them. Find why you feel like a bad person for getting angry. Discover why you feel less than when you don’t know something you shouldn’t know. Bring those parts back into yourself so you can be whole. This is the hardest part as there are so many of them. Free your gargoyles by shining love and care on them. I suggest a licensed therapist for this process. However, Don’t go gargoyle smashing alone.
Basic Maintenance
In the book, boundaries for your soul, the author speaks about what is healthy and not. She points out that when exploring yourself, if you feel toxic shame, then it’s time to address that part of yourself. This is a lifelong process. The culture we live in encourages us to make statues instead of breaking them. When I catch myself fantasizing about superpowers, I remind myself, You Don’t Need Superpowers. Then I review the day to see where the stressor came from. In the book Indistractable, Nir teaches that every distraction happens because of a trigger. Grabbing your phone could be triggered by boredom and so on and so forth. Find the shame signal and break yet another statue.
You are human, and that is Good.
Additional Readings
Please note, I am not a therapist. I have just lived through a lot in my life and want to share my experiences and knowledge. if you experience any issues while reading this blog, please speak to a licensed therapist.
by David | Jul 10, 2023 | Information Technology, PowerShell
Last week we discussed sending emails with Graph API. You can read about it here. Today we will be taking that script and making it so it can be automated. On the backend, you will need to create an Azure App. You can read about how to do that here. The following code only works in Powershell 7 and above. Automating with Graph API works best in PowerShell 7. You will need to set up your App with Users.Read.All and Mail.Send as the minimal. levels.
The Script
import-module Microsoft.Graph.Users
Import-module Microsoft.Graph.Users.Actions
$EmailToSend = "A Cloud Email @ your domain"
$EmailToReceive = "Any Email"
$AppID = "This is your App ID"
$SecuredPassword = "This is your Password"
$tenantID = "This is your tenant ID"
$SecuredPasswordPassword = ConvertTo-SecureString -String $SecuredPassword -AsPlainText -Force
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $AppID, $SecuredPasswordPassword
Connect-MgGraph -TenantId $tenantID -ClientSecretCredential $ClientSecretCredential
#Connect-MgGraph -Scopes "User.Read.All, Mail.Send"
$users = Get-MgUser -filter "accountenabled eq false"
$ReturnString = ""
foreach ($user in $users) {
if ($null -ne (Get-MgUserLicenseDetail -UserId $user.Id)) {
[pscustomobject][ordered]@{
UPN = $user.UserPrincipalName
Licenses = (Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", "
}
$ReturnString = $ReturnString + "$($user.UserPrincipalName): $((Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", ")`n"
}
}
$body = @"
<html>
<header>Licenses</header>
<body>
<center>
<h1>Disabled Users</h1>
<h2>With Licenses</h2>
</center>
$ReturnString
</body>
</html>
"@
$params = @{
message = @{
subject = "Disabled Users with Licenses"
body = @{
contentType = "HTML"
content = $body
}
toRecipients = @(
@{
emailAddress = @{
address = $EmailToReceive
}
}
)
}
saveToSentItems = "false"
}
# A UPN can also be used as -UserId.
Send-MgUserMail -UserId $EmailToSend -BodyParameter $params
The Breakdown
This script is the same as last week’s except for how it connects and how you feed the email addresses. We are using the Client Secret Credential flag, which is only available in Powershell 7, to trigger the connect command. You need some basic information first. This information will allow Automating with Graph API to work.
$AppID = "This is your App ID"
$SecuredPassword = "This is your Password"
$tenantID = "This is your tenant ID"
The App is the application ID from the azure app you created. the tenant ID is also the tenant ID of the azure app you created. Remember, I stated to keep the secret key value. This is where you will use it. Place it in the Secure Password area. Next, we need to convert this information into a secure object.
$SecuredPasswordPassword = ConvertTo-SecureString -String $SecuredPassword -AsPlainText -Force
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $AppID, $SecuredPasswordPassword
Now, we need to convert the plain text to a secure string. We do this with the convertto-securestring command. We enter the string and force it with the force tag. Once we have done that, we want to create a credential object. We use the new-object command to create an automation pscredential object. We feed it the appID and the password we created above. This gives us the ps object that we will use for the next part.
Connect-MgGraph -TenantId $tenantID -ClientSecretCredential $ClientSecretCredential
Using the connect-mggraph command we connect to our tenant and pass the app id and password as a single object. This will connect us directly to Graph API. Later we will run this script through the task scheduler. The remainder of the script will stay the same. Finally, we supply the email addresses. Automating with Graph API couldn’t be easier. So Enjoy!
Additional Links
by David | Jul 5, 2023 | Information Technology, PowerShell
Last week we spoke about finding disabled users with licensing using PowerShell and graph API. Today, we will be expanding from that blog. We are going to send the results ourselves. Next week, we will create this into an automation using application rights and azure apps. However, today we will send Emails with Graph API and Powershell.
The Script
import-module Microsoft.Graph.Users
Import-module Microsoft.Graph.Users.Actions
Connect-MgGraph -Scopes "User.Read.All, Mail.Send"
$users = Get-MgUser -filter "accountenabled eq false"
$ReturnString = ""
foreach ($user in $users) {
if ($null -ne (Get-MgUserLicenseDetail -UserId $user.Id)) {
[pscustomobject][ordered]@{
UPN = $user.UserPrincipalName
Licenses = (Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", "
}
$ReturnString = $ReturnString + "$($user.UserPrincipalName): $((Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", ")`n"
}
}
$EmailSend = Read-Host "Email Address to send (Cloud Only)"
$Emailreceive = Read-Host "Email Address to Receive"
$body = @"
<html>
<header>Licenses</header>
<body>
<center>
<h1>Disabled Users</h1>
<h2>With Licenses</h2>
</center>
$ReturnString
</body>
</html>
"@
$params = @{
message = @{
subject = "Disabled Users with Licenses"
body = @{
contentType = "HTML"
content = $body
}
toRecipients = @(
@{
emailAddress = @{
address = $Emailreceive
}
}
)
}
saveToSentItems = "false"
}
# A UPN can also be used as -UserId.
Send-MgUserMail -UserId $EmailSend -BodyParameter $params
The Breakdown
The same
Like last week, we are using the Microsoft Graph PowerShell module. The first part of this code is the same as last week. So you can take a good read on that one. The only difference is our scope. We are adding mail.send. Mail.Send allows us to send emails from cloud users. It will not work with inactive, soft-deleted, or on-premise-hosted devices. Thus the connect-mggraph will look like the below
Connect-MgGraph -Scopes "User.Read.All, Mail.Send"
The only other thing we have added to the original script is a return string. We initialize the return string with a $returnstring = “” and then we build the string out. Using the same as before, we grab the SKU part number. Finally, we use the join. The difference is we wrap the command in a bubble, $(), for our string. Then we put the sting, the new information, and a line break, `n, into the string.
$ReturnString = $ReturnString + "$($user.UserPrincipalName): $((Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", ")`n"
Emails with Graph API
The first thing we want to know is Who we are sending the email to and Who is sending the email. The one sending the email has limitations. First, it can’t be an inactive user. The user can’t be in a soft-deleted state. Finally, it has to be hosted in the cloud. The person we are sending to has to have an email box.
The next part is where we create the email we are going to send. Remember that returnstring we made a few moments ago, it’s time to use that. We are using a here string. Here strings allows large string data like an HTML page, to be placed into a string. Here strings are set apart using the @ symbol. Take a look at the $body below.
$body = @"
<html>
<header>Licenses</header>
<body>
<center>
<h1>Disabled Users</h1>
<h2>With Licenses</h2>
</center>
$ReturnString
</body>
</html>
"@
Params
Please note that some PowerShell ide does not like the tabbing inside a here-string. The next part is the parameters of the email system. We are sending a message. Additional documentation can be found here. We are going to use the following tags, subject, body, to recipient, and save to sent items. All of these items are setup as a Json file as the API uses Json as well.
- Subject: What is the subject of the email
- Body: body contains the content type and the content. Here is where we will be using our $body.
- To Recipients: This is where the email addresses will go. We set up an email address and have it as an array.
- Save to Sent Items: Finally, we determine if we want this item to stay in our sent items.
$params = @{
message = @{
subject = "Disabled Users with Licenses"
body = @{
contentType = "HTML"
content = $body
}
toRecipients = @(
@{
emailAddress = @{
address = $Emailreceive
}
}
)
}
saveToSentItems = "false"
}
Finally, we use the send-mgusermail command. This is where we use the send email. It will be the UPN of the target user we want to send email from. The body parameter will be the parameters we just built. Once you do this, you will see the email come in accordingly. That’s how you can send Emails with Graph API.
by David | Jun 26, 2023 | Information Technology, PowerShell
Microsoft licensing can cost a lot of money. It’s not logical to have a disabled account have licenses. Some licenses can cost up to $25 USD a month. So if you have 4 of these disabled accounts with licenses, that could easily be 100 per month. Let us Find Disabled Users with Graph API using PowerShell and find which ones have licenses.
Today’s post will be using the Microsoft.graph.users module. We can connect to graph API via the API, or we can use the Powershell module. In previous posts, I have shown how to connect to the API and pull information. This is still one of the best methods to use as the Graph API module has no way to search for things like shared mailboxes. I will cover that in a later post. So, let’s dive into the graph users module. You can read the documentation here.
The script
import-module Microsoft.Graph.Users
Connect-MgGraph -Scopes "User.Read.All"
$users = Get-MgUser -filter "accountenabled eq false"
foreach ($user in $users) {
if ($null -ne (Get-MgUserLicenseDetail -UserId $user.Id)) {
[pscustomobject][ordered]@{
UPN = $user.UserPrincipalName
Licenses = (Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", "
}
}
}
Disconnect-mggraph
The Breakdown
First of all, look at how little code there is compared to the previous post. The Connect-MGGraph removes so much back end work. When you run this command it will prompt you to grant it permissions. Once you disconnect, those permissions disappear. if you have a global admin account, if you don’t put in a scope, you gain access to everything. Which is super nice and scary. I prefer to have scope so I don’t break things.
If you don’t have the “Microsoft.Graph.Users” module, install it. You can install it by using the install-module commandlet.
Connect-MgGraph -Scopes "User.Read.All"
Like I said before, The connect-MGgraph command allows you to do scopes. This is very important. Back in the day we used msol. When we connected we had full control unless we limited our accounts which caused issues. In this case we are creating a temporary azure app. See the previous post about how to make an azure app. You will see how time saver this command can be. That azure app will have the scopes that you give it. If you don’t give it a scope, it has your rights. So, if you are a global admin, you can do damage on accident. It’s nice not to be in the scary ages anymore. So give it scope. In this case we are using User.Read.All as our scope. The User.Read.All permissions will help us Find Disabled Users.
$users = Get-MgUser -filter "accountenabled eq false"
The next part is where we grab all the disabled accounts. Using the Get-MgUser commandlet, we trigger the filter option. We want only accounts that are not enabled. thus the account enabled is equal to false. Very simple idea. If you run users[1] you can see the items you can search with. I do not suggest searching for anything to crazy.
The loop
Now we have all the disabled accounts we want to find the Licensed ones. We need to create a for each loop. Foreach loops are a staple for data controls. Without it… it’s just a pain. As we loop, we want to find the ones with a licenses. We need the user id from the account. So the best thing to do is do an if statement.
foreach ($user in $users) {
if ($null -ne (Get-MgUserLicenseDetail -UserId $user.Id)) {
#Do Something
}
}
In this if statement we pull the licenses using the Get-MgUserLicenseDetail with the users id. If there is nothing that comes from this command it will return a null. So we test null against the command. It’s slightly faster than testing the command against null. Every user inside this if statement that is true will have a licensing. We want to display that information.
[pscustomobject][ordered]@{
UPN = $user.UserPrincipalName
Licenses = (Get-MgUserLicenseDetail -UserId $user.id).SkuPartNumber -join ", "
}
Here we create a PowerShell custom object. We want to display the User Principal Name, also known as, the sign name. We do this by using the $user from the foreach loop and just tag the user principal name. Next, we want to display all the licenses. The licenses come as an array. For example, my test account has 3 licenses. I want all that as a string. So, we use the Get-mguserlicensedetail command. We pull out the SKU part number. Then we do some array magic. The -join “, ” converts the array into a string. At the end of each line it adds a “,” and a space. Which makes it easier to read. The cool part about this is if it’s just one license, we it will not add the “, ” to the end. This makes it super readable.
One catch though, thanks to how Microsoft likes to hide things, the SKU is going to be coded. For example, it might say spe_f1. which means it’s an F1 license for Microsoft office. while of1 could mean the same thing but purchased from a different location. I use to try to keep a living list, however, these sku change daily and finding them will be hard. This is where Google is your friend.
Finally, we disconnect from graph API. We don’t want that app to stay there do we? Yeah, we disconnect like good admins we are. Once you are disconnected, you can review all the information this script provided. I am not a big fan of automating the removal of licenses through this method because many times other admins will licenses disabled accounts to keep email alive as a shared mailbox or other oddities. Right now, graph API poweshell module just doesn’t work with shared mailboxes. It is on the workbooks though.
Now go, Find Disabled Users With Graph API and Powershell, and Enjoy your day.
by David | Jun 19, 2023 | Mental Health
Do you struggle with any kind of addiction? Well, I should say, what is your addiction? Everyone has one. Each addiction is held to society’s standards which they live in. For example, here in America, overworking is praised while in other mature countries, it’s looked down upon as it makes you unproductive. Some addictions are needed parts of life. Like food. Sobriety isn’t starving yourself to death. So, how do you define Sobriety in human needs addiction? We follow an acronym “S.A.F.E.S.”
Secret, Abusive, Feelings, and Empty
S.ecret
Is it a secret? So, are you in the closet eating a doughnut? Are you hiding your financials from your SO because you are spending that money on sketchy massage places? How about other things? How about eating out to hide those emotions? If you can’t tell your SO, accountability partners, etc… It might be a good idea to leave it alone. I know it’s a hard concept because it’s simple.
A.busive
This one is really important. Is it abusive? Is the intent of eating xyz to damage you? To feed some core emotion? Is your long showers really good for you? How about buying that on amazon? Drinking that drink? How is it abusive to yourself? At first it’s hard to see if something is abusive to yourself. So, it’s important to look at your behavior in your addiction to see if it is. Sometimes we will take naturally happening items and say its abusive. For example, when a guy sees a woman and thinks she is attractive and focuses on what he sees as attractive. This is natural. Men are designed to see sexual compatibility. Now, if he takes it to the next level and starts the chase while being married, that is more abusive. At the end of that road is just pain and loneliness.
Another example would be politics. I spoke with a young lady who didn’t know if playing a black character in a game was racist. She spent hours and ended up crying in a corner. This is self-abuse. This was not a safe line of thinking for her. Abuse can come in many forms and each addiction has it’s own structure.
F.eelings
Feelings and abusive oftentimes go hand in hand. For example, when I am depressed, I will go out and eat. This is abusive to my finances and my body. However, it helps the depressive state I am feeling. Instead of addressing the feelings, I am masking my feelings. I have seen people drugs, sex, alcohol, and more. If you find yourself wanting to hide away from what you are feeling, what you are doing might not be safe. It’s always better to address the feelings instead of masking them. A bandaid can’t fix a broken arm.
E.mpty
Masking your feelings will leave you empty. If you start feeling emptiness and or loneliness, it’s time to pull back and ask yourself if what you are doing is part of S.A.F.E.S. or not. That loneliness will eat you alive and leave you in a space where you can’t see yourself anymore. Over time, you can start seeing additional issues crop up to hide the issues that you are using to mask. That emptiness is destructive.
S.hame
I have added Shame to Overeater’s anonymous. Shame can come in healthy and toxic forms. If you are feeling a sense of worthlessness, self-hate and more. It’s time to run. Run as fast as you can. Call your accountability partner. Call upon your higher power. Do something. you are not what your mind is telling you at this point. You have entered the results of the unsafe cycle. What you are doing or going to do will bring you down and more than likely lead to a full relapse.
S.A.F.E.S.
Just imagine a safe and each action you take should go through that safe. If you have more than one issue, like myself, it’s best to have a few of these safes. Don’t let the secret control what you do. Avoid self-abuse. It’s not ok to mask the emotions for too long as it brings emptiness and breath toxic shame into your life. Keep a sticky note with “S.A.F.E.S.” in your car, on the monitor of your computer. The refrigerator at the house. The candy jar, and any other place that you might find yourself doing actions outside of the safes.
Additional Resources