<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Andrey Picado Blog</title>
    <link>https://andreypicado.com/</link>
    <description>Recent content on Andrey Picado Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language><managingEditor>andreypicado506@gmail.com (Andrey Picado)</managingEditor>
    <webMaster>andreypicado506@gmail.com (Andrey Picado)</webMaster><lastBuildDate>Mon, 17 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://andreypicado.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Scripted Single and Multi-Dimensional JSON Matrices in GitHub Actions</title>
      <link>https://andreypicado.com/posts/2025/2025-11-17-scripted-single-and-multi-dimensional-json-matrices-in-github-actions/</link>
      <pubDate>Mon, 17 Nov 2025 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2025/2025-11-17-scripted-single-and-multi-dimensional-json-matrices-in-github-actions/</guid>
      
      <description>&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2025/2025-11-17-scripted-single-and-multi-dimensional-json-matrices-in-github-actions/images/image-6-1024x512.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;With the &lt;strong&gt;matrix&lt;/strong&gt; strategy in GitHub Actions, you can automatically create multiple job runs based on the combinations of the variables defined in the matrix. GitHub Actions workflows expose this through the &lt;code&gt;jobs.&amp;lt;job_id&amp;gt;.strategy.matrix&lt;/code&gt; property, which enables running different variations of a job.&lt;/p&gt;
&lt;p&gt;A matrix can be &lt;strong&gt;single&lt;/strong&gt; or &lt;strong&gt;multi&lt;/strong&gt;-dimensional, depending on the number of variables it defines. The number of resulting jobs for a given matrix can be calculated as follows:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>A GitHub Action to write comments on GitHub Issues</title>
      <link>https://andreypicado.com/posts/2025/2025-11-09-github-actions-composite-action-comment-on-issues-and-pull-requests-using-github-script-octokit-validated-inputs-secure-tokens-clear-errors/</link>
      <pubDate>Sun, 09 Nov 2025 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2025/2025-11-09-github-actions-composite-action-comment-on-issues-and-pull-requests-using-github-script-octokit-validated-inputs-secure-tokens-clear-errors/</guid>
      
      <description>&lt;p&gt;The GitHub REST API for issues exposes an endpoint to create comments. Because pull requests are implemented as issues, the same endpoint can also be used to comment on pull requests. As the documentation states, “&lt;em&gt;every pull request is an issue, but not every issue is a pull request&lt;/em&gt;.”&lt;/p&gt;
&lt;h2 id=&#34;permissions-required-to-write-comments-in-an-issue&#34;&gt;Permissions required to write comments in an issue&lt;/h2&gt;
&lt;p&gt;To create a comment, the token used by your workflow must have write access to &lt;strong&gt;issues&lt;/strong&gt; and &lt;strong&gt;pull requests&lt;/strong&gt;. Since the focus of this article is automation, we’ll use GitHub App installation access tokens as the input to the action.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Distinguishing Rejected Jobs in GitHub Repository Webhooks</title>
      <link>https://andreypicado.com/posts/2025/2025-05-02-identify-rejected-github-jobs/</link>
      <pubDate>Fri, 02 May 2025 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2025/2025-05-02-identify-rejected-github-jobs/</guid>
      
      <description>&lt;p&gt;When configuring a webhook for a GitHub repository—specifically for the &lt;strong&gt;&lt;code&gt;workflow_job&lt;/code&gt;&lt;/strong&gt; event—it can be challenging to determine whether a given delivery corresponds to a rejected workflow job.&lt;br&gt;
Rejected jobs refer to those that were not approved by a required reviewer, typically for deployments targeting a protected environment.&lt;/p&gt;
&lt;p&gt;To identify a rejected job, let’s examine a delivery triggered by the &lt;strong&gt;&lt;code&gt;workflow_job.completed&lt;/code&gt;&lt;/strong&gt; event. We&amp;rsquo;ll focus on the &lt;strong&gt;&lt;code&gt;workflow_job&lt;/code&gt;&lt;/strong&gt; payload and highlight the key attributes that signal a rejection. Here’s an example payload from a workflow_job.completed webhook event:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Simplifying GitHub API Queries with the actions/github-script Action</title>
      <link>https://andreypicado.com/posts/2025/2025-01-09-simplifying-github-api-queries-with-actions-github-script/</link>
      <pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2025/2025-01-09-simplifying-github-api-queries-with-actions-github-script/</guid>
      
      <description>&lt;p&gt;I faced the challenge of making complex queries to the GitHub API. Initially, I started with a bash script, as it’s often the simplest solution for many of my use cases. However, after reviewing the documentation, I discovered an official action designed specifically for interacting with the GitHub API. Upon further exploration, I realized that using this action would be much easier than continuing with bash or Python.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/actions/github-script&#34;&gt;actions/github-script&lt;/a&gt; provides a straightforward way to query the GitHub API. It comes with convenient features, such as the ability to get and set outputs, as well as seamless access to GitHub context details.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Automatically update major version tags with new releases on GitHub</title>
      <link>https://andreypicado.com/posts/2024/2024-08-31-automatically-update-major-version-tags-with-new-releases-on-github/</link>
      <pubDate>Sat, 31 Aug 2024 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2024/2024-08-31-automatically-update-major-version-tags-with-new-releases-on-github/</guid>
      
      <description>&lt;p&gt;This GitHub Action workflow is designed to run whenever a new release is published in your GitHub repository. To enhance flexibility, the workflow_dispatch event is included, allowing manual trigger of the workflow for rollbacks or other administrative tasks. The workflow performs the following actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tag Validation:&lt;/strong&gt; Checks if the release tag adheres to the semantic versioning specification. This validation can be configured to fail the workflow if the tag format is incorrect, ensuring consistency in versioning.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Encrypting data with Terraform and GCP Cloud KMS</title>
      <link>https://andreypicado.com/posts/2024/2024-03-28-encrypting-data-with-terraform-and-gcp-cloud-kms/</link>
      <pubDate>Thu, 28 Mar 2024 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2024/2024-03-28-encrypting-data-with-terraform-and-gcp-cloud-kms/</guid>
      
      <description>&lt;p&gt;This article explains how to leverage the &lt;a href=&#34;https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/kms_secret_ciphertext&#34;&gt;google_kms_secret_ciphertext&lt;/a&gt; resource for encrypting data using a symmetric key with Terraform on GCP. This resource exports a &lt;strong&gt;ciphertext&lt;/strong&gt; attribute that you can use to create a file in a bucket or to define a custom metadata key in a VM. Therefore, we will cover three key areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Cloud KMS on GCP&lt;/strong&gt;: Create and configure the necessary things on GCP for the &lt;a href=&#34;https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/kms_secret_ciphertext&#34;&gt;google_kms_secret_ciphertext&lt;/a&gt; resource to work properly. First, we will enable the required API (&lt;strong&gt;cloudkms&lt;/strong&gt;), create the &lt;strong&gt;keyRing&lt;/strong&gt;, and finally, the &lt;strong&gt;key&lt;/strong&gt;. Next, we&amp;rsquo;ll review the permissions required to work with KMS and service accounts.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Cuando pase el temblor: notificaciones de Jenkins a la carta</title>
      <link>https://andreypicado.com/posts/2024/2024-01-06-cuando-pase-el-temblor-notificaciones-de-jenkins-a-la-carta/</link>
      <pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2024/2024-01-06-cuando-pase-el-temblor-notificaciones-de-jenkins-a-la-carta/</guid>
      
      <description>&lt;p&gt;En 2024 se cumplirán 10 años de la muerte de &lt;a href=&#34;https://es.wikipedia.org/wiki/Gustavo_Cerati&#34;&gt;Gustavo Cerati&lt;/a&gt;, reconocido por propios y extraños como una de las figuras más relevantes del rock en español. Si bien vivió gran parte de su carrera como solista, fue en 1985, mientras integraba &lt;strong&gt;Soda Stereo&lt;/strong&gt;, que publicó el tema &amp;ldquo;&lt;strong&gt;Cuando pase el temblor&lt;/strong&gt;&amp;rdquo;:&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=ZNzYr4U7Zs8&#34;&gt;https://www.youtube.com/watch?v=ZNzYr4U7Zs8&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Soda Stereo se inmortaliza en la historia con su tema &amp;ldquo;Cuando pase el temblor&amp;rdquo; del disco &amp;ldquo;Nada personal&amp;rdquo;, publicado en 1985.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Dynamic Parameters in Jenkins Jobs</title>
      <link>https://andreypicado.com/posts/2023/2023-11-12-dynamic-parameters-in-jenkins-jobs/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-11-12-dynamic-parameters-in-jenkins-jobs/</guid>
      
      <description>&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2023/2023-11-12-dynamic-parameters-in-jenkins-jobs/images/DALL%C2%B7E-2023-11-12-12.58.17-A-wide-image-portraying-the-concept-of-the-Groovy-programming-language-with-a-programmatic-script.-The-image-should-showcase-a-wide-horizontal-comput-1024x585.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Today, we will explore two different approaches to parameterizing Jenkins jobs. Utilizing the &lt;strong&gt;&lt;a href=&#34;https://plugins.jenkins.io/uno-choice/&#34;&gt;Active Choices plugin&lt;/a&gt;&lt;/strong&gt;, we aim to address two common challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Populating a Parameter with External Data&lt;/strong&gt;: For instance, you might want to list the regions available for deploying EC2 instances in an AWS account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dynamically Updating Parameters Based on Other Selections&lt;/strong&gt;: For example, you may wish to update the available AMIs according to the AWS region selected by a user.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Implementation of the Luhn Algorithm in Ansible</title>
      <link>https://andreypicado.com/posts/2023/2023-09-03-implementation-luhn-algorithm-in-ansible/</link>
      <pubDate>Sun, 03 Sep 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-09-03-implementation-luhn-algorithm-in-ansible/</guid>
      
      <description>&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2023/2023-09-03-implementation-luhn-algorithm-in-ansible/images/LUNH-1024x535.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;The Luhn or mod 10 algorithm &lt;a href=&#34;https://en.wikipedia.org/wiki/Luhn_algorithm&#34;&gt;is a simple check digit formula used to validate a variety of identification numbers&lt;/a&gt;. It is widely used for the validation of debit and credit card numbers. Its implementation in Ansible is fairly simple using &lt;a href=&#34;https://docs.ansible.com/ansible/latest/plugins/plugins.html&#34;&gt;plugins&lt;/a&gt;, which is an Ansible feature meant to &amp;ldquo;&lt;em&gt;augment Ansible’s core functionality&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/andreypicado506/mod10_algorithm_ansible.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;working-with-plugins-in-ansible&#34;&gt;Working with plugins in Ansible&lt;/h2&gt;
&lt;p&gt;According to the &lt;a href=&#34;https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html#writing-plugins-in-python&#34;&gt;documentation&lt;/a&gt;, Ansible plugins must follow these rules:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>An Ansible role to install OpenSSH on Windows</title>
      <link>https://andreypicado.com/posts/2023/2023-08-15-an-ansible-role-to-install-openssh-on-windows/</link>
      <pubDate>Tue, 15 Aug 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-08-15-an-ansible-role-to-install-openssh-on-windows/</guid>
      
      <description>&lt;p&gt;When working with Ansible and Windows, many find &lt;a href=&#34;https://docs.ansible.com/ansible/latest/os_guide/windows_winrm.html#id15&#34;&gt;WinRM&amp;rsquo;s limitations&lt;/a&gt; both frustrating and tricky to navigate. Managing Windows &lt;a href=&#34;https://andreypicado.com/remote-windows-management-from-linux-using-dockers/&#34;&gt;remotely from a Linux environment&lt;/a&gt; presents unique challenges due to these constraints. From my vantage point, OpenSSH emerges as a more stable and speedy alternative compared to WinRM. This might account for its widespread recommendation as a remedy for WinRM&amp;rsquo;s shortcomings. Fortunately, there&amp;rsquo;s comprehensive official support and documentation available for &lt;a href=&#34;https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui&#34;&gt;OpenSSH on Windows&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Given this backdrop, our objective is to devise a playbook to set up OpenSSH and incorporate a public key. This will enable us to establish a connection from a Linux host using key-based authentication. This playbook assumes WinRM is enabled and properly configured in the target machine. Here&amp;rsquo;s an overview of our steps:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Deploy a Visual Studio Instance Using Kubernetes on DigitalOcean</title>
      <link>https://andreypicado.com/posts/2023/2023-06-18-deploy-a-visual-studio-instance-using-kubernetes-on-digitalocean/</link>
      <pubDate>Sun, 18 Jun 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-06-18-deploy-a-visual-studio-instance-using-kubernetes-on-digitalocean/</guid>
      
      <description>&lt;p&gt;For some cases, a private and easily accessible Visual Studio instance may be a good idea. Almost &lt;a href=&#34;https://comparecloud.in/&#34;&gt;all cloud providers&lt;/a&gt; offer a managed Kubernetes service. Today I am going to use DigitalOcean service, but the process should be very similar for other cloud providers. On this occasion, we are going to create a &lt;strong&gt;cluster with a single node&lt;/strong&gt;. You can provision a Kubernetes cluster on the &lt;a href=&#34;https://cloud.digitalocean.com/&#34;&gt;DigitalOcean website&lt;/a&gt; or you can use the corresponding &lt;a href=&#34;https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs/resources/kubernetes_cluster&#34;&gt;Terraform provider&lt;/a&gt;. Once the cluster is created, locate the configuration file and download it.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Set up Grafana OSS with minikube</title>
      <link>https://andreypicado.com/posts/2023/2023-04-19-set-up-grafana-oss-with-minikube/</link>
      <pubDate>Wed, 19 Apr 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-04-19-set-up-grafana-oss-with-minikube/</guid>
      
      <description>&lt;p&gt;Grafana is a &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Grafana&#34;&gt;is a multi-platform open source analytics and interactive visualization web application&lt;/a&gt;&amp;rdquo;. It can be used for data visualization and metrics monitoring, including infrastructure such as servers and containers.&lt;/p&gt;
&lt;p&gt;To deploy Grafana using Kubernetes, you will need a host with Kubernetes installed or a cloud service to do it such as EKS or AKS. To keep things simple, in this case, I&amp;rsquo;ll use a Linux server with &lt;em&gt;&lt;strong&gt;minikubectl&lt;/strong&gt;&lt;/em&gt; installed. To install &lt;strong&gt;&lt;strong&gt;&lt;strong&gt;minikubectl&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt; on Linux, you can follow the &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/start/&#34;&gt;official documentation&lt;/a&gt;. Keep in mind that &lt;em&gt;&lt;strong&gt;minikube&lt;/strong&gt;&lt;/em&gt; has several &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/start/&#34;&gt;hardware requirements&lt;/a&gt; that could be a problem if you have limited resources. Before deploying Grafana, you should have your &lt;strong&gt;&lt;em&gt;minikube&lt;/em&gt;&lt;/strong&gt; cluster up and running. Once that&amp;rsquo;s done, if you already had &lt;em&gt;&lt;strong&gt;kubectl&lt;/strong&gt;&lt;/em&gt; installed you can just use the usual command (kubectl&amp;hellip;) or you can use &lt;em&gt;&lt;strong&gt;minikube kubectl&lt;/strong&gt;&lt;/em&gt; instead.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Updating the .war file of your containerized Jenkins instance</title>
      <link>https://andreypicado.com/posts/2023/2023-03-12-updating-the-war-file-of-your-containerized-jenkins-instance/</link>
      <pubDate>Sun, 12 Mar 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-03-12-updating-the-war-file-of-your-containerized-jenkins-instance/</guid>
      
      <description>&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2023/2023-03-12-updating-the-war-file-of-your-containerized-jenkins-instance/images/image.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;In some cases, after you log in to Jenkins and go to ‘&lt;strong&gt;Manage Jenkins&lt;/strong&gt;’, it will show you a message saying “&lt;em&gt;&lt;strong&gt;New version of Jenkins (x) is available for download (changelog)&lt;/strong&gt;”.&lt;/em&gt; If you click ‘download’ it will start to download the latest .war Jenkins file. Here we are going to see the installation process of that file if you are running Jenkins in a docker container. If you installed Jenkins with a different method, the process to update the .war file &lt;a href=&#34;https://stackoverflow.com/questions/11062335/update-jenkins-from-a-war-file&#34;&gt;may be different&lt;/a&gt;.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Ansible Runner: Ansible from Python code</title>
      <link>https://andreypicado.com/posts/2023/2023-02-12-ansible-runner-ansible-from-python-code/</link>
      <pubDate>Sun, 12 Feb 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-02-12-ansible-runner-ansible-from-python-code/</guid>
      
      <description>&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2023/2023-02-12-ansible-runner-ansible-from-python-code/images/RUNNERS-1024x535.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;ansible-runner.readthedocs.io/&#34;&gt;Ansible Runner&lt;/a&gt; is a Python module that allows you to run Ansible playbooks from Python code. It offers &lt;a href=&#34;https://ansible-runner.readthedocs.io/en/latest/python_interface/&#34;&gt;&amp;quot;&lt;strong&gt;directly importable and usable API for interfacing with Ansible&lt;/strong&gt;&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In Python, one way of dealing with Ansible is to just call it using modules such as &lt;code&gt;**subprocess**&lt;/code&gt; or &lt;code&gt;**os.system**&lt;/code&gt;. &lt;strong&gt;Ansible Runner&lt;/strong&gt; offers a more &amp;lsquo;&lt;a href=&#34;https://medium.com/swlh/the-pythonic-way-6ad73abfbb00&#34;&gt;Pythonic way&lt;/a&gt;&amp;rsquo; of doing this, by providing a Python API for running Ansible playbooks. It also &amp;ldquo;&lt;strong&gt;&lt;a href=&#34;https://ansible-runner.readthedocs.io/en/latest/python_interface/&#34;&gt;exposes a few helper interfaces&lt;/a&gt;&lt;/strong&gt;&amp;rdquo; which allows you to supply&lt;br&gt;
recommended inputs to launch a Runner process. Here I will review how to run an &lt;strong&gt;ad hoc Ansible&lt;/strong&gt; command and a &lt;strong&gt;playbook&lt;/strong&gt; using &lt;strong&gt;Ansible Runner&lt;/strong&gt;.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Create a virtual machine in Proxmox with Python and Terraform</title>
      <link>https://andreypicado.com/posts/2023/2023-01-22-create-a-virtual-machine-in-proxmox-with-python-and-terraform/</link>
      <pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2023/2023-01-22-create-a-virtual-machine-in-proxmox-with-python-and-terraform/</guid>
      
      <description>&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2023/2023-01-22-create-a-virtual-machine-in-proxmox-with-python-and-terraform/images/prox-1-1024x535.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;If are like me, you have a lab at home. In my case, after checking different options, I decided to use &lt;a href=&#34;https://www.proxmox.com/en/&#34;&gt;Proxmox&lt;/a&gt; as my main hypervisor. It is open-source and Debian-based, with a simple web console. Also, there is a &lt;a href=&#34;https://registry.terraform.io/providers/Telmate/proxmox/latest/docs&#34;&gt;terraform provider&lt;/a&gt; for it, which we will be looking at today. Using Python, we will create a script to deploy a new VM in Proxmox. To do that we will call Terraform from the Python code using the &lt;a href=&#34;https://pypi.org/project/python-terraform/&#34;&gt;python-terraform&lt;/a&gt; wrapper.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Install Jenkins with Docker using an Ansible playbook</title>
      <link>https://andreypicado.com/posts/2022/2022-12-25-install-jenkins-with-docker-using-an-ansible-playbook/</link>
      <pubDate>Sun, 25 Dec 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-12-25-install-jenkins-with-docker-using-an-ansible-playbook/</guid>
      
      <description>&lt;p&gt;There are a &lt;a href=&#34;https://stackoverflow.com/questions/44440164/what-are-the-advantages-of-running-jenkins-in-a-docker-container&#34;&gt;few advantages&lt;/a&gt; of installing Jenkins using Docker. These advantages include faster delivery, more scalability, and easier management. Here we will create a bash script to install Jenkins with that approach. Then, we will transform that script into an Ansible playbook with the shell module.&lt;/p&gt;
&lt;p&gt;For this example, I will use CentOS 7. You can find specific instructions to install Docker on multiple platforms on the &lt;a href=&#34;https://docs.docker.com/get-docker/&#34;&gt;Docker official website&lt;/a&gt;. There are instructions available for &lt;a href=&#34;https://docs.docker.com/desktop/install/windows-install/&#34;&gt;Windows&lt;/a&gt;, several &lt;a href=&#34;https://docs.docker.com/desktop/install/linux-install/&#34;&gt;Linux distributions&lt;/a&gt;, and &lt;a href=&#34;https://docs.docker.com/desktop/install/mac-install/&#34;&gt;Mac&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>&lt;strong&gt;Passing arguments to your Python script&lt;/strong&gt;</title>
      <link>https://andreypicado.com/posts/2022/2022-12-12-passing-arguments-to-your-python-script/</link>
      <pubDate>Mon, 12 Dec 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-12-12-passing-arguments-to-your-python-script/</guid>
      
      <description>&lt;p&gt;Since I am so used to PowerShell, my first thought when I wanted to call a python script was to do something like “script -argument”. Of course, Python offers this functionality too. With the help of &lt;strong&gt;sys.argv&lt;/strong&gt; you have a very simple way to enable parameters for your Python script.&lt;/p&gt;
&lt;h3 id=&#34;using-sysargv&#34;&gt;&lt;strong&gt;Using Sys.argv&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&#34;https://docs.python.org/3/library/sys.html&#34;&gt;&lt;strong&gt;argv&lt;/strong&gt;&lt;/a&gt; attribute of the sys (sys.argv)module offers a way to pass command line arguments to a Python script. It creates a list, and the arguments can be called using &lt;strong&gt;argv[n]&lt;/strong&gt; where &lt;strong&gt;n&lt;/strong&gt; is the position of the parameter in the command line. &lt;strong&gt;argv[0]&lt;/strong&gt; would be the name of the script, &lt;strong&gt;argv[1]&lt;/strong&gt; the first argument after the name of the script, &lt;strong&gt;argv[2]&lt;/strong&gt; the second one and so on. This behavior can be seen if we print &lt;a href=&#34;https://docs.python.org/3/library/sys.html&#34;&gt;&lt;strong&gt;sys.argv&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>&lt;strong&gt;Create a VM in AWS using Terraform&lt;/strong&gt;</title>
      <link>https://andreypicado.com/posts/2022/2022-11-21-create-a-vm-in-aws-using-terraform/</link>
      <pubDate>Mon, 21 Nov 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-11-21-create-a-vm-in-aws-using-terraform/</guid>
      
      <description>&lt;p&gt;Today we will create a simple t2.micro instance in AWS using Terraform. Currently, t2.micro instances are available in the &lt;a href=&#34;https://aws.amazon.com/ec2/pricing/?loc=ft#Free_tier&#34;&gt;AWS Free Tier&lt;/a&gt;. Everything here will be performed from a Windows environment. However, with a few adjustments, you will be able to follow with a different OS. That said, you will need the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Terraform installed.&lt;/strong&gt; The official documentation to install Terraform can be found here. Essentially, you will need the appropriate binary for your system and to update your PATH environment variable to include the local path of the Terraform binary in your computer.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>&lt;strong&gt;Remote Windows Management from Linux using Dockers&lt;/strong&gt;</title>
      <link>https://andreypicado.com/posts/2022/2022-11-06-remote-windows-management-from-linux-using-dockers/</link>
      <pubDate>Sun, 06 Nov 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-11-06-remote-windows-management-from-linux-using-dockers/</guid>
      
      <description>&lt;p&gt;Since &lt;a href=&#34;https://arstechnica.com/information-technology/2016/08/powershell-is-microsofts-latest-open-source-release-coming-to-linux-os-x/&#34;&gt;PowerShell Core 6&lt;/a&gt;, PowerShell became cross-platform, free and open source. There is, of course, &lt;a href=&#34;https://learn.microsoft.com/en-us/powershell/scripting/whats-new/unix-support?view=powershell-7.2&#34;&gt;some limitations&lt;/a&gt; when it comes to PowerShell for non-Windows platforms. Microsoft documentation explains that:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“PowerShell on Linux and macOS uses .NET Core, which is a subset of the full .NET Framework on Microsoft Windows. As a result, scripts that run on Windows may not run on non-Windows platforms because of the differences in the frameworks.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;With this in mind, I wanted to see if it was possible to manage Windows from Linux using WinRM (keep in mind that New-PSSession offers support for connections to a Windows remote host over SSH). In Windows PowerShell, you can use &lt;strong&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/new-pssession?view=powershell-7.2&#34;&gt;New-PSSession&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-7.2&#34;&gt;Invoke-Command&lt;/a&gt;&lt;/strong&gt; to manage a Windows host remotely. First, let us provide a basic example of the usage of those cmdlets in Windows PowerShell:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Run a Powershell script in a Jenkins pipeline</title>
      <link>https://andreypicado.com/posts/2022/2022-10-17-run-a-powershell-script-in-a-jenkins-pipeline/</link>
      <pubDate>Mon, 17 Oct 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-10-17-run-a-powershell-script-in-a-jenkins-pipeline/</guid>
      
      <description>&lt;p&gt;With &lt;a href=&#34;https://www.jenkins.io/&#34;&gt;Jenkins&lt;/a&gt;, you can automate a lot of CI/CD stuff pretty easily. That means, as you probably expect, that you can automatically run Powershell scripts from it without too much hassle.&lt;/p&gt;
&lt;p&gt;To follow this guide, you will need to have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A working &lt;strong&gt;Jenkins controller&lt;/strong&gt; in a Linux host that has &lt;strong&gt;Powershell installed.&lt;/strong&gt; You can find the official installation guide for Jenkins &lt;a href=&#34;https://www.jenkins.io/doc/book/installing/&#34;&gt;here&lt;/a&gt;. To install Powershell in your Linux host, you can follow the MS documentation available &lt;a href=&#34;https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux?view=powershell-7.2&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Powershell script&lt;/strong&gt; that you need to run &lt;strong&gt;hosted in a public GitHub&lt;/strong&gt; repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before we continue, keep in mind that some cmdlets available for Windows Powershell are not going to work with the Powershell package available for Linux. For instance, things like &lt;a href=&#34;https://adamtheautomator.com/powershell-linux/#:~:text=your%20Bash%20terminal.-,PowerShell%20on%20Linux%20Limitations,-Just%20because%20you&#34;&gt;Get-PSDrive or Get-CimInstance are not available for Linux&lt;/a&gt;. To avoid this, be sure to test you script before you include it in a Jenkins Pipeline.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Automatically elevate a Powershell session</title>
      <link>https://andreypicado.com/posts/2022/2022-09-18-automatically-elevate-a-powershell-session/</link>
      <pubDate>Sun, 18 Sep 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-09-18-automatically-elevate-a-powershell-session/</guid>
      
      <description>&lt;p&gt;By default, recent versions of Windows ship with something called &lt;a href=&#34;https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works&#34;&gt;User Account Control (UAC)&lt;/a&gt;. Because of this, &lt;em&gt;“standard users and administrators access resources and run apps in the security context of standard users”.&lt;/em&gt; For this to work Windows creates two different types of tokens based on the user privileges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Standard user access token&lt;/li&gt;
&lt;li&gt;Administrator access token&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All users receive the standard access token, but only members of the Administrators group will have the administrator token available. However, this token is not used by default. Each time the administrator user needs to perform a task that requires administrator permissions, Windows will prompt the user for approval. According to Windows documentation, &lt;a href=&#34;https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works&#34;&gt;this is called an elevation prompt&lt;/a&gt;:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Programmatically switch between audio devices in Windows</title>
      <link>https://andreypicado.com/posts/2022/2022-08-29-programmatically-switch-between-audio-devices-in-windows/</link>
      <pubDate>Mon, 29 Aug 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-08-29-programmatically-switch-between-audio-devices-in-windows/</guid>
      
      <description>&lt;p&gt;Recent versions of Windows offer simple ways to change your default audio devices to play or record sounds. In the case of Windows 10, that option is conveniently located in the task bar. But what if you want to automatically change the audio device?&lt;/p&gt;
&lt;h2 id=&#34;manage-your-audio-devices-from-powershell-with-audiodevicecmdlets&#34;&gt;&lt;strong&gt;Manage your audio devices from PowerShell with AudioDeviceCmdlets&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;AudioDeviceCmdlets is a module available in the “&lt;a href=&#34;https://www.powershellgallery.com/packages/AudioDeviceCmdlets/3.1.0.2&#34;&gt;Powershell Gallery&lt;/a&gt;” website and it also has a &lt;a href=&#34;https://github.com/frgnca/AudioDeviceCmdlets&#34;&gt;GitHub repo&lt;/a&gt;. To install it run the following command:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Use CSS to style HTML reports in PowerShell</title>
      <link>https://andreypicado.com/posts/2022/2022-07-31-use-css-to-style-the-html-reports-in-powershell/</link>
      <pubDate>Sun, 31 Jul 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-07-31-use-css-to-style-the-html-reports-in-powershell/</guid>
      
      <description>&lt;p&gt;&lt;strong&gt;ConvertTo-HTML&lt;/strong&gt; allows to add all kind of different elements into an HTML file. HTML files have a simple structure that usually include a head and a body. Those elements can be modified with &lt;strong&gt;ConvertTo-HTML&lt;/strong&gt; parameters. Let us check the syntax of this cmdlet first (this cmdlet has two sets of parameters, we are using the first one):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;ConvertTo-Html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-InputObject&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PSObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-As&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-CssUri&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-PostContent&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-PreContent&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Meta&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Hashtable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Charset&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-Transitional&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;[&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CommonParameters&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When it comes to HTML, &lt;a href=&#34;https://www.w3schools.com/tags/tag_head.asp&#34;&gt;“The &lt;head&gt; element is a container for metadata (data about data)”&lt;/a&gt;. It typically contains information like scripts, character sets and style. Naturally, we need to find a way to modify the style of the resultant file and we can do that using CSS. There is three ways to include CSS in an HTML:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Encrypting data with a key in PowerShell</title>
      <link>https://andreypicado.com/posts/2022/2022-07-09-encrypting-data-with-a-key-in-powershell/</link>
      <pubDate>Sat, 09 Jul 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-07-09-encrypting-data-with-a-key-in-powershell/</guid>
      
      <description>&lt;p&gt;If you need to encrypt text in your PowerShell code, &lt;strong&gt;ConvertFrom-SecureString&lt;/strong&gt; can help you do it. The &lt;strong&gt;-Key&lt;/strong&gt; parameter of that cmdlet allows you to use a key that can be stored in a file. This could be useful if you don’t want to have sensitive information in plain text in your code.&lt;/p&gt;
&lt;p&gt;Let us look at the help for &lt;strong&gt;ConvertFrom-SecureString&lt;/strong&gt;. This cmdlet has 3 different sets of parameters (or 2 in PS 5.1). In this occasion, we are interested in the one with the key parameter:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Create a new Windows Domain with Ansible using the win_powershell module</title>
      <link>https://andreypicado.com/posts/2022/2022-06-26-create-a-new-windows-domain-with-ansible-using-the-win_powershell-module/</link>
      <pubDate>Sun, 26 Jun 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-06-26-create-a-new-windows-domain-with-ansible-using-the-win_powershell-module/</guid>
      
      <description>&lt;p&gt;In this entry, we are going to use &lt;a href=&#34;https://docs.ansible.com/&#34;&gt;Ansible&lt;/a&gt; to manage a Windows host. To create a control node, the machine that is going to run Ansible, &lt;a href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html&#34;&gt;you have to use a UNIX-like system&lt;/a&gt;. This opens the possibility to use the Windows Subsystem for Linux if an independent control node is not an option for you. In our case, we will use a Debian GNU/Linux 11 (bullseye) machine as the control node and a Windows Server 2019 Standard as the host. In the control node we have the following relevant packages installed:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>A bash script to generate random passwords</title>
      <link>https://andreypicado.com/posts/2022/2022-06-06-creating-a-bash-script-to-generate-random-passwords/</link>
      <pubDate>Mon, 06 Jun 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-06-06-creating-a-bash-script-to-generate-random-passwords/</guid>
      
      <description>&lt;p&gt;There is a couple of ways to create a random password with shell/bash. For instance, we can just pipe the &lt;strong&gt;date&lt;/strong&gt; command to &lt;strong&gt;md5sum&lt;/strong&gt; or &lt;strong&gt;sha256sum&lt;/strong&gt; to generate a seemingly random string that can be used as a password:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;date &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; md5sum
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;71192e8f893e41e54f5356716c81a2de  -
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;date &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sha256sum
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;11d1d0e43bd5ab65e2c7d14505856562213339f852f0195e3b53a9418babf5d0  -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is a start. If we don’t want the whole string, when can trim the result with &lt;strong&gt;head&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;date &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sha256sum &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -c 10&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The 10 after &lt;strong&gt;-c&lt;/strong&gt; tells &lt;strong&gt;head&lt;/strong&gt; to show the first 10 characters. However, this is not the best approach for several reasons. When it comes to passwords, a lot of services, websites and applications request the use of special characters, upper-case and lower-case letters. Also, &lt;strong&gt;date&lt;/strong&gt; is not a random value (or at least not a &lt;a href=&#34;https://en.wikipedia.org/wiki/Pseudorandom_number_generator&#34;&gt;pseudorandom number&lt;/a&gt;). A good way to generate a random number for a password is to use &lt;strong&gt;/dev/urandom.&lt;/strong&gt;  The &lt;strong&gt;man&lt;/strong&gt; command for urandom reads &lt;em&gt;“the random number generator gathers environmental noise from device drivers and other sources into an entropy pool”&lt;/em&gt;. Piping &lt;strong&gt;/dev/urandom&lt;/strong&gt; to &lt;strong&gt;head&lt;/strong&gt;, we can see how it works, but now we have the opposite problem: a bunch of symbols and characters that are not accepted for most passwords. With that in mind, we need to find a way to get rid of that: &lt;strong&gt;tr&lt;/strong&gt;. This command allow us to “&lt;em&gt;translate or delete characters&lt;/em&gt;”.  So we will need to take the input from &lt;strong&gt;/dev/urandom&lt;/strong&gt; and sent it to &lt;strong&gt;tr&lt;/strong&gt;. For that, we’re going to use the &lt;strong&gt;-d&lt;/strong&gt; and &lt;strong&gt;-c&lt;/strong&gt; options available for &lt;strong&gt;tr&lt;/strong&gt;. According to the help, those options can do the following:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Creating your own objects with PSCustomObject</title>
      <link>https://andreypicado.com/posts/2022/2022-05-08-creating-your-own-objects-with-pscustomobject/</link>
      <pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-05-08-creating-your-own-objects-with-pscustomobject/</guid>
      
      <description>&lt;p&gt;PSCustomObject offers us an excellent way to create structured data in PowerShell. According to the documentation, [pscustomobject] is a &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_type_accelerators?view=powershell-7.2&#34;&gt;type accelerator&lt;/a&gt;. Type accelerators &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_type_accelerators?view=powershell-7.2&#34;&gt;“allow you to access specific .NET framework classes without having to explicitly type the entire class name”&lt;/a&gt;. The full class name for PSCustomObject is System.Management.Automation.PSObject, which means PSCustomObject is just an alias for that class. Digging a bit further, the PSObject Class “&lt;em&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.psobject?view=powershellsdk-7.0.0&#34;&gt;Wraps an object providing alternate views of the available members and ways to extend them. Members can be methods, properties, parameterized properties, etc.”&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Add one or more users to one or more security groups in Active Directory</title>
      <link>https://andreypicado.com/posts/2022/2022-04-24-add-one-or-more-users-to-one-or-more-security-groups-in-active-directory/</link>
      <pubDate>Sun, 24 Apr 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-04-24-add-one-or-more-users-to-one-or-more-security-groups-in-active-directory/</guid>
      
      <description>&lt;p&gt;I have covered this topic in a previous &lt;a href=&#34;https://andreypicado.com/add-several-users-to-an-ad-group-with-powershell/&#34;&gt;post&lt;/a&gt;, but in that occasion I only explained how to add one or more users to a single group. Sometimes you have different requirements, and it could be useful to be able to add one or more users to one or more groups with the same script. With that in mind, let’s see what we can do to achieve that with PowerShell.&lt;/p&gt;
&lt;p&gt;The first thing we need is the input. For this case we can use &lt;a href=&#34;https://andreypicado.com/add-several-users-to-an-ad-group-with-powershell/&#34;&gt;Import-Csv, Import-Clixml, ConvertFrom-Json…&lt;/a&gt; or just create an array. For users we will use the sAMAccountName property and for groups the Name property. To keep things simple, just to show you the logic of the script, let’s use an array for both users and groups:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Custom columns and table entries with Format-Table</title>
      <link>https://andreypicado.com/posts/2022/2022-04-11-custom-columns-and-table-entries-with-format-table/</link>
      <pubDate>Mon, 11 Apr 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-04-11-custom-columns-and-table-entries-with-format-table/</guid>
      
      <description>&lt;p&gt;Sometimes objects in PS don’t have a descriptive property name or the information of an object could use a little bit of formatting to better fit our purposes. Take for example the VirtualMemorySize64 property of the processes running on Windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;PS &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;C:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Windows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;system32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Get-Process&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Format-Table&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;VirtualMemorySize64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
&lt;p&gt;&lt;img src=&#34;https://andreypicado.com/posts/2022/2022-04-11-custom-columns-and-table-entries-with-format-table/images/image-1.png&#34; alt=&#34;Output of Get-Process | Format-Table Name, VirtualMemorySize64&#34;&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Output of Get-Process | Format-Table Name, VirtualMemorySize64&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That’s a big number. We can dig a bit further to check its type to have a better idea of what we’re dealing with:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Iterate a shared network folder to look into domain users or security group permissions</title>
      <link>https://andreypicado.com/posts/2022/2022-03-27-iterate-a-shared-network-folder-and-its-subfolders-to-look-into-domain-users-or-security-group-permissions-with-powershell/</link>
      <pubDate>Sun, 27 Mar 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-03-27-iterate-a-shared-network-folder-and-its-subfolders-to-look-into-domain-users-or-security-group-permissions-with-powershell/</guid>
      
      <description>&lt;p&gt;The &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-acl?view=powershell-7.2&#34;&gt;Get-Acl cmdlet&lt;/a&gt; can help us to obtain the access control list of a resource, for example a directory. With this information we can determine the permissions that a domain user or a security group has over a resource. Let’s check the help for this command:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Get-Acl
   [[-Path] &amp;lt;String[]&amp;gt;]
   [-Audit]
   [-Filter &amp;lt;String&amp;gt;]
   [-Include &amp;lt;String[]&amp;gt;]
   [-Exclude &amp;lt;String[]&amp;gt;]
   [&amp;lt;CommonParameters&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The Get-Help shows three different sets of parameters for Get-Acl: by path, by object and by literal path. For the purpose of this article, we’re going to stick with the first one. Regarding this cmdlet, we’re going to use several properties of the resultant object: Access, IdentityReference and FileSystemRights. Access property is actually a &lt;a href=&#34;https://social.technet.microsoft.com/Forums/lync/en-US/4375ba22-e758-42f9-a7ec-7f2abfaa2574/using-getacl-to-view-the-advanced-permissions-of-as-folder?forum=ITCG&#34;&gt;collection of ACE&lt;/a&gt; objects that include IdentityReference and FileSystemRights.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Moving users or computers in AD with the Move-ADObject cmdlet</title>
      <link>https://andreypicado.com/posts/2022/2022-03-14-moving-users-or-computers-in-ad-with-the-move-adobject-cmdlet/</link>
      <pubDate>Mon, 14 Mar 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-03-14-moving-users-or-computers-in-ad-with-the-move-adobject-cmdlet/</guid>
      
      <description>&lt;p&gt;According to the &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/module/activedirectory/move-adobject?view=windowsserver2022-ps&#34;&gt;official documentation&lt;/a&gt;, Move-ADObject “&lt;em&gt;Moves an Active Directory object or a container of objects to a different container or domain&lt;/em&gt;”. The straightforward noun-verb structure of PS also suggest what you can do with it. Let’s review the syntax:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Move-ADObject
    [-WhatIf]
    [-Confirm]
    [-AuthType &amp;lt;ADAuthType&amp;gt;]
    [-Credential &amp;lt;PSCredential&amp;gt;]
    [-Identity] &amp;lt;ADObject&amp;gt;
    [-Partition &amp;lt;String&amp;gt;]
    [-PassThru]
    [-Server &amp;lt;String&amp;gt;]
    [-TargetPath] &amp;lt;String&amp;gt;
    [-TargetServer &amp;lt;String&amp;gt;]
    [&amp;lt;CommonParameters&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Both -Identity and -TargetPath are obligatory parameters. Regarding -Identity, we can use a distinguished name or a GUID as values. -TargetPath, on the other hand, &lt;em&gt;“must be the path to a container or organizational unit”.&lt;/em&gt; So, in order to use Move-ADObject we must:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Checking and comparing user AD group membership</title>
      <link>https://andreypicado.com/posts/2022/2022-02-16-checking-and-comparing-user-ad-group-membership/</link>
      <pubDate>Wed, 16 Feb 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-02-16-checking-and-comparing-user-ad-group-membership/</guid>
      
      <description>&lt;p&gt;In the AD module for PS there&amp;rsquo;s an easy cmdlet that allow us to check the groups a user is member of. We&amp;rsquo;re talking about &lt;strong&gt;Get-ADPrincipalGroupMemberShip&lt;/strong&gt;. Let&amp;rsquo;s check the sintaxis:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Get-ADPrincipalGroupMembership
   [-AuthType &amp;lt;ADAuthType&amp;gt;]
   [-Credential &amp;lt;PSCredential&amp;gt;]
   [-Identity] &amp;lt;ADPrincipal&amp;gt;
   [-Partition &amp;lt;String&amp;gt;]
   [-ResourceContextPartition &amp;lt;String&amp;gt;]
   [-ResourceContextServer &amp;lt;String&amp;gt;]
   [-Server &amp;lt;String&amp;gt;]
   [&amp;lt;CommonParameters&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Interpreting the sintaxis, we are able to conclude the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because &amp;ldquo;&lt;strong&gt;-Identity&amp;rdquo;&lt;/strong&gt; parameter and value &lt;strong&gt;&amp;quot;&lt;ADPrincipal&gt;&lt;/strong&gt;&amp;quot; aren&amp;rsquo;t enclosed in square brackets we know is mandatory. Identity parameter is also positional, which means that if we don&amp;rsquo;t provide the -Identity parameter before the value, PS will know we&amp;rsquo;re referring to -Identity. To be more clear &amp;ldquo;&lt;em&gt;Get-ADPrincipalGroupMembership &lt;strong&gt;-Identity bob.marley&lt;/strong&gt;&lt;/em&gt;&amp;rdquo; is the same thing as &amp;ldquo;&lt;em&gt;Get-ADPrincipalGroupMembership &lt;strong&gt;bob.marley&lt;/strong&gt;&lt;/em&gt;&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this opportunity we-re only using samAccountName as value for -Identity. To check the AD group membership of a user we can run:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Keep your Ubuntu Server tasks running with Screen</title>
      <link>https://andreypicado.com/posts/2022/2022-01-23-keep-your-linux-ubuntu-server-tasks-running-with-screen/</link>
      <pubDate>Sun, 23 Jan 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-01-23-keep-your-linux-ubuntu-server-tasks-running-with-screen/</guid>
      
      <description>&lt;p&gt;Sometimes it can be useful to leave your server working on a task in case you need to disconnect yourself from it. With screen we can create and resume sessions easily.&lt;/p&gt;
&lt;p&gt;To install screen on Ubuntu, type the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo apt install screen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Is always a good idea to update the local package list from your server by running &lt;strong&gt;apt update&lt;/strong&gt; before installing a new package. That way, you know you&amp;rsquo;re installing &lt;a href=&#34;https://askubuntu.com/questions/222348/what-does-sudo-apt-get-update-do&#34;&gt;the latest software available and avoiding compatibility issues&lt;/a&gt;. Once installed, you can check it with:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Remote port forwarding with SSH</title>
      <link>https://andreypicado.com/posts/2022/2022-01-09-remote-port-forwarding-with-ssh/</link>
      <pubDate>Sun, 09 Jan 2022 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2022/2022-01-09-remote-port-forwarding-with-ssh/</guid>
      
      <description>&lt;p&gt;Let’s say you are developing an application in your computer, and you want others to see it. For that, you first host the app locally making it accessible from localhost. Then, you wonder what you can do to share it with people outside of your network. Remote port forwarding SSH can solve this problem.&lt;/p&gt;
&lt;p&gt;In Linux terminal or PS/CMD on Windows, from the computer where you have the app or website hosted, you&amp;rsquo;ll using a command like the following:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Get the hash value of a file with PowerShell</title>
      <link>https://andreypicado.com/posts/2021/2021-12-27-get-the-hash-value-of-a-file-with-powershell/</link>
      <pubDate>Mon, 27 Dec 2021 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2021/2021-12-27-get-the-hash-value-of-a-file-with-powershell/</guid>
      
      <description>&lt;p&gt;Sometimes is useful to be able to look for the hash value of a file without using third party software. Since PowerShell comes installed by &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/install/installing-windows-powershell?view=powershell-7.2&#34;&gt;default with Windows&lt;/a&gt; and it has an specific cmdlet for this purpose, this process can be very simple.&lt;/p&gt;
&lt;h2 id=&#34;using-get-filehash-cmdlet&#34;&gt;Using Get-FileHash cmdlet&lt;/h2&gt;
&lt;p&gt;This cmdlet, according to &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-7.2&#34;&gt;Microsoft Documentation&lt;/a&gt;, “&lt;em&gt;Computes the hash value for a file by using a specified hash algorithm”&lt;/em&gt; and by default it uses SHA256 algorithm. Hash values are useful since they can show even the smallest changes in the contents of a file. For instance, if you want to verify if a file is safe, you can compare the hash value of that file to see if it has been modified. That said, let’s review the basic syntax of the cmdlet:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Add several users to an AD group with PowerShell</title>
      <link>https://andreypicado.com/posts/2021/2021-12-25-add-several-users-to-an-ad-group-with-powershell/</link>
      <pubDate>Sat, 25 Dec 2021 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2021/2021-12-25-add-several-users-to-an-ad-group-with-powershell/</guid>
      
      <description>&lt;p&gt;If you use the Active Directory Module for PowerShell, we’re going to review a couple of simple applications of the ADGroupMember cmdlet. This article will work for you if you need to add one or several users to the same AD group.&lt;/p&gt;
&lt;h2 id=&#34;using-add-adgroupmember-cmdlet&#34;&gt;Using Add-ADGroupMember cmdlet&lt;/h2&gt;
&lt;p&gt;To start using this cmdlet, you can copy and paste the following instruction:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PS C:\&amp;gt; Add-ADGroupMember -Identity &amp;#34;GROUP_NAME&amp;#34; -Members USER_NAME1, USER_NAME2, USER_NAME3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Where:&lt;br&gt;
&lt;strong&gt;&lt;code&gt;GROUP_NAME&lt;/code&gt;&lt;/strong&gt; is the name of the AD Group you want to add the users to.&lt;br&gt;
&lt;code&gt;**USER_NAMEX**&lt;/code&gt; is the &lt;a href=&#34;https://docs.microsoft.com/en-us/windows/win32/ad/naming-properties#samaccountname&#34;&gt;SamAccountName&lt;/a&gt; property of the user. If the email of the user is &lt;a href=&#34;mailto:first.name@company.com&#34;&gt;first.name@company.com&lt;/a&gt; , then your SamAccountName is &lt;a href=&#34;http://first.name/&#34;&gt;first.name&lt;/a&gt;. Remember that you can use the command Get-ADUser to check the properties of a given user, to be more specific you can use Get-ADUser -Identity &amp;ldquo;USER_NAME&amp;rdquo; -Properties * to check that. Also, this cmdlet will only work if you have enough permissions to add users to the target AD group.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Fixing MS Teams slowness, lag or inability to send messages</title>
      <link>https://andreypicado.com/posts/2021/2021-12-25-fixing-ms-teams-slowness-lag-inability-to-send-messages-or-media-files-and-weird-behavior-windows-and-mac/</link>
      <pubDate>Sat, 25 Dec 2021 00:00:00 +0000</pubDate>
      
      <author>andreypicado506@gmail.com (Andrey Picado)</author>
      
      <guid>https://andreypicado.com/posts/2021/2021-12-25-fixing-ms-teams-slowness-lag-inability-to-send-messages-or-media-files-and-weird-behavior-windows-and-mac/</guid>
      
      <description>&lt;p&gt;This article will work for you if your installation of MS Teams is suffering at least one of the following symptoms: lag, media not loading, inability to send text messages or files (such as images) or weird behaviors like parts missing from the interface or similar.&lt;/p&gt;
&lt;h2 id=&#34;first-steps&#34;&gt;First steps&lt;/h2&gt;
&lt;p&gt;A bad or inestable network connection can be causing issues with MS Teams. Most of the time, restarting your modem can solve a lot of network related issues. Also, you can check if your computer hasn&amp;rsquo;t been restarted for a while. In that case, is recommendable to restart your computer (in Windows environments, make sure to select &lt;strong&gt;Restart&lt;/strong&gt; from &lt;strong&gt;Start&lt;/strong&gt;). It’s also a good idea to check and apply updates for your SO.&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>