Read the latest posts from Wordsmith.

from Forever Adventure


There are two main phrases I’ve used in my previous, first post that I would like to clarify before I go further into my ideas, in order for us to be on the same page and for you to understand me even if you haven’t or won’t read the books I have mentioned.

The first one of these is “Illusions”. The definition of the word is “false belief”. Something that is not real, only we think it is. I would say illusions are concepts, objects, behaviors, thoughts, and just generally creations created and upheld by individuals and therefore by masses without them realizing. According to Wikipedia, “although illusions distort our perception of reality, they are generally shared by most people”.

Neal, the author of the book I have previously mentioned has a whole book on the topic of Illusions. Now, I don’t feel like I am somebody who is yet another person repeating the same things in writing, so I’ll just say, if you feel called to it, read it, listen to it, or simply choose to remember. As I said in the introduction, I believe you need nothing (this could be something relevant a paragraph later) to remember who you are, you need no books, gurus, or anything. You yourself can decide to remember who you are. Explaining and having a written form of the truth is available. I honestly mean that I am somebody who enjoys explaining and answering to questions, but note that the general truth will be the same from my side too. So the reason for me recommending Neal is not because his work is my bible or my القرآن but because I would literally say the same and you may understand why after you've read it. The book is called “Communion with God”. However, I will use the list of 10 illusions the book features so as to get the idea through.

The 10 illusions and next to it, the universal truth.

  1. Need exists. — God needs nothing.
  2. Failure exists. — God cannot fail, and neither can you.
  3. Disunity exists. — Nothing is separate from anything.
  4. Insufficiency exists. — There is enough.
  5. Requirement exists. — There is nothing you have to do.
  6. Judgement exists. — You will never be judged.
  7. Condemnation exists. — You will never be condemned.
  8. Conditionality exists. — Love knows no condition.
  9. Superiority exists. — A thing cannot be superior to itself.
  10. Ignorance exists. — You already know all this.

These are all perceptions that some people, a 'long, long' time ago made up, and people are living in this world, acting like these are the rules of nature, acting like these illusions are equal to the simple fact that if you don’t get oxygen in your system for a couple of minutes, your body will stop functioning. I encourage you to take a moment to think about it. Think about the fact that literally everything around you, physical or institutional wouldn’t exist if society decided so. We made it, we choose, every day to uphold it, and we can choose to diminish it. This is true for everything except the functional minimum we, as monkeys evolved on this planet with – air, food, water. Everything else is a product of years and years of mostly unconscious creation by a species who has the creating power, but does not recognize it, because they forgot about it. We are on a ship that is going towards an iceberg, screaming in fear, yet we choose not to recognize that the ship is driven by us.

The illusion of need is the base of it all, where it all comes from. You do not NEED anything besides what I have already mentioned, the functional minimum (which many people these days don’t, nor do they have the opportunity to have so others can have it by multitudes – apparently people call this a working society/system).

I’d like to come back to the term “the functional minimum” meaning that in nature, there is no need. In the place humans have evolved, you didn’t need to wear clothes, heat your house – in fact, you didn’t need a house – or work in order to have food. Nature provides the water for you to drink from a spring or any water body, the fruit to eat from a tree, while basic body function is guaranteed by intelligent cells and organs. The rest is a creation, conscious or unconscious. You can have it, but consider not fooling yourself by refusing to take responsibility, blaming it on long dead people who made up all these concepts.

If this seems like an interesting topic, I encourage you to read the book, as I can see my truth on those pages. Not the other way around.

I see a community fully conscious of its creating power, where people, instead of living in the illusions, choosing not to realize they are in fact, creations, use their creating power to live in a way that’s in alignment with them/their beliefs. Where people use the illusions to consciously and mindfully create experiences they wish to live through. I would love to go back to nature, to my natural form. The condition of the planet and the attitude of society affects this to a significant degree, nonetheless I would like to experience this. I invite you to be together, if you desire to create and experience this too.

As you may remember I mentioned, that there are two things for me to explain, and the next post possibly will be about that, namely remembering. In that post I also plan to include why I refer to this experience as Forever Adventure. Thank you for reading this. I am thankful for you. (yellow heart emoji)


from Team H2O Spray

What Are The Differences Between Soft Washing and Pressure Washing?

Exterior cleaning services are a popular way to restore a property's appearance. It doesn't matter if it's a commercial or residential building; cleaning services like soft washing and power washing can completely transform the curb appeal. Whether you're considering cleaning services for your commercial property or would like to enhance the look of your home, you may be curious about the top methods for cleaning and how they can affect your home or business.

Both soft washing and pressure washing offer incredible benefits. One feature many homeowners enjoy is the removal of harmful contaminants like algae, mold, and mildew. These allergens often play a significant role in an individual's health, especially for respiratory problems. But which works better for cleaning specific surfaces? Is there a difference? What should you look for when hiring a professional exterior cleaning company?

What Exactly Is Soft Washing?

Soft washing is an industry-leading service that eliminates dirt and, more importantly, algae, mold, and mildew. Technicians will choose soft washing for more sensitive areas like siding and roofing that require a gentler approach. While soft washing uses less pressure, it can implement other strategies like detergents to assist with containment removal. For those that don't want chemicals used for cleaning, there are great alternatives available that deliver the same great results without harming the environment.

Soft washing is most commonly used on roofs. Roofs require a gentle approach to cleansing so as not to disrupt the roofing shingles or cause damage. Your exterior cleaning company will likely choose soft wash paired with a detergent to extract algae, mold, and mildew that are commonly found on roofing surfaces.

What Is Pressure Washing (Also known as Power Washing)?

Pressure washing, as it sounds, uses high water pressures to remove dirt and debris. With sheer force, many things that cause imperfections can be quickly removed. Often, exterior cleaners will use pressure washing on firm surfaces like concrete. They can remove rust, oils, dirt, and much more. Pressure washing isn't as delicate as soft washing but is quite useful.

Technicians can use electric or gas power washers. Typically, gas-powered is the preferred method for pressure washing. Most gas-powered pressure washers can reach greater PSI (pounds per square inch). The higher PSI, the better results, or more effective at removing tough stains.

Team H2O Spray provides a wide range of exterior cleaning services, including power washing, gutter cleaning, deck cleaning, commercial cleaning, and much more. To learn more about Team H20 Spray, visit their website online at https://www.h2ospray.com/.

Our Social Pages: https://www.facebook.com/TeamH2OSpray/ https://twitter.com/teamh2ospray https://www.pinterest.com/teamh2ospray/


from cruisinit

In Markdown and in several CMS sufficient code beautifiers work out of the box. But what if you dislike the color pattern or need more control? Manually apply HTML styles to every key word? And if you need the styles inline because your CMS ignores <styles>, but let's you insert inline format commands? You would not do that.

You need pandoc, and if you need inline styles, you need premailer. If you are content with the first results, you are done in a few seconds. If you want to author your own style patterns, that will take you some hours the first time. But never as long as a manual edit would take.

This has been tested on Linux Mint Ulyana. Since Python and pandoc exist for almost every real system around (not for the little pocket play machines), you should be able to do this on every serious machine.

Preparation (once):

Download pandoc. Play with my sample command and the several styles you can use. Create your own styles, if you want.

Only if you need inline styles: Ensure Python and PIP in your System. Install premailer.

Beautify a peace of code works this way:

1. pandoc works easiest with Markdown input. Embrace the code part by at least three ~~~ and define the language (cf. list of languages pandoc supports and highlights, in its man pages / command line help or on its website.)

  ~~~~~~ {.powershell}

Tip: To show markdown code on a markdown site, nest two ~ row pairs, use another count of ~ for start and end row of the inner pair than for the other.

2. Have pandoc convert your .md to .html. Fenced code blocks (those embraced by ~~~) are automatically syntax highlighted. With -s, pandoc writes a standalone html that you can open in your browser and immediately check the result. If you don't like the color pattern, set another highlighter on the command line. If you want, you can create your own highlighter for repeated use.

$ pandoc "/path/file.ps1.md" -s -o "/path/file.ps1.html" --metadata pagetitle="file.ps1"

If you have full control over your website's code, you can use the <style>s and the lines of code directly in your html. If your target is an edit control in a CMS or a mail body editor you will need the next step.

3. Have premailer convert <style>s into inline styles.

$ python3 -m premailer -f "/path/file.ps1.html" > "/path/file.ps1.inline.html"

from cruisinit

To produce a widely accepted signature that validates as a PAdES signature, you need to sign your PDF with an SSL signature of X.509 standard, that the issuing Certificate Authority (CA) has flagged to be intended for code / object signing. In this contribution I stress on the act of signing PDF documents, and just say: Inform yourself e.g. on the website of the association cacert.org how to obtain a code and object signing SSL certificate, and how to handle, configure and use certificates in your system(s), browser(s) and applications. As long as you don't have an SSL certificate, you cannot use this kind of official signature method, but can sign it with GPG.

The process itself is very easy if you use LibreOffice and Firefox. You can export to PDF every LibreOffice document and in the export dialogue select your personal digital signature certificate. Or you sign an existing PDF by (menu) File / Digital Signatures / Sign Existing PDF. But before doing it for the first time, you might need to tell LibreOffice where your Firefox profile with the Firefox certificate store is located, and maintain a list of timestamp servers' URLs that work for you.

When I first selected (menu) File / Export as / Export as PDF / (tab) Digital signatures / (button) Select..., I saw ... nothing.


It took me hours to find the reason: LibreOffice on Linux searches for signing certs in Firefox' or Thunderbird's certificate store, I had migrated my Firefox profile from Windows, and instead of throwing the profile contents into the default profile folder I had used another folder and edited Firefox' configuration. So I manually gave LibreOffice the differing path in Tools / Options / Security / Certificate Path, and could select my certificate. I could sign my PDF, open it in LibreOffice Draw, and it validated as a correct Adobe signature.

NSS path in LibreOffice Options.

Since timestamping signatures is a good idea, I searched and found a list of free timestamp servers. I inserted some URLs into the list in (menu) Tools / Options / Security / (button) TSAs, tested them, and when I selected one of the entries to timestamp my signature in the (menu) File / Export As / Export As PDF / (tab) Digital Signatures / (dropdown) Time Stamp Authority, my signature validated as a PAdES signature in LibreOfficeDraw.

 $ pdfsig path.pdf -nssdir (Firefox profile path) -dump

revealed that the timestamp server URL is part of the signature. (pdfsig is part of the poppler-utils, Linux Mint Software Center installed them for me.)


from Welcome to the Saladhax Blog!

New Year, New Stuff

There are a lot of thing's I've always wanted to do, but I always kind of forgot about them since I never had much time, or because I just got lazy and decided to push them off until I just forgot about them. But after the dumpster fire that was 2020, and a bunch of staying at home doing nothing, I decided to start the new year off by doing some of the things I've been wanting to do for a while, and trying to stick with them as best as I could.

First thing is starting a YouTube channel. Ever since I started watching videos by YouTubers like MKBHD and Linus Tech Tips, I've always thought it would be fun to have a YouTube channel of my own for tech stuff. Of course, since I was a very involved person all throughout high school, I never had time. I also tried to hold myself to a high standard for my videos, and make videos like the YouTubers mentioned above, which just made things harder. But now, I've decided it would be fun to start making videos on YouTube, LBRY, and PeerTube! I've also decided to take a different approach in making my videos than I had before. No scripts, no unnecessary fancy stuff, no unnecessary planning, just point the webcam at myself, talk, and do things on my computer if necessary. That should make things simpler, take up less time, and make things a little more fun!

I've also started to work more on cybersecurity stuff. I've been wanting to learn some more cybersecurity stuff for a while now, since it interests me, and I haven't gotten that far in my college classes yet. I started working with TryHackMe a while ago, but just kinda got lazy and forgot about it. And while I did have classes and marching band to worry about, I still just kind of spent free time watching TV. But now, I've given myself the challenge of doing a small bit of TryHackMe every day I can. I feel like this will not only give me a head start for my cybersecurity classes later on, but it will also be a fun thing to do when I'm bored.

Finally, I'm going to try and get back into running. I've been running for fun since I was in 4th grade, and I did cross country and track all through out middle school and high school, as well as ran a couple of half marathons. Then, college came along. My first semester, classes and marching band kept me reasonably busy, so I didn't get much of a chance to run. Then Covid happened, and with the lockdown, and the general idea of staying inside, I just never got around to running. I also gained the “Freshman 15” over my freshman year, which didn't help. But I always had fun going out on runs, so I might try to find a place to run in the town my college is in, and try to go on a run every once in a while.

Now, will I run out of time to do some of this? Maybe. But I figured it would be a fun thing to try in case I don't!

This is post 13 of #100daystooffload


from Forever Adventure

Introduction (question mark)

I would like to think that with time, I will get more comfortable writing down my thoughts, expressing my feelings. Nonetheless it takes quite some energy for me to focus on being calm and gather all the things I would like to transform into words. I can firmly say though that I try with all my heart to explain and get the message through.

I would like to insert a quick little explanation for those 9 people who followed the FA blog on tumblr, that is about why I left that platform. I deleted that blog, because I try to switch to FOSS apps/services in every way my technical knowledge lets me. I think I will choose to discard most posts made there and start everything anew here.

I would like to begin with who I am and then what my soul's desire is. My name is Nappé, I am from Hungary and I am 22 years old. I am somebody who feels isolated in this world regarding my beliefs and desires. I live with a lovely girl and two packages of love, Haku & Tinta. (Haku is a 2 year old dog and Tinta is a 2 year old cat.) Both of them joined us in this village at almost the same time as we did and since then we experience life together. Growing up was harsh on me and until I was around 19-20 years old, I really wanted to make life work for myself. I really tried fitting in. I tried, until I totally collapsed. I was actively thinking and planning on ending my life, I really had no fun whatsoever on this planet and I was not even able to be thankful for all the things that I am thankful for today. When I was around 16-17 and chose to leave the original family I grew up with, I have found a book on the bookshelf of my later becoming new family. I have not opened it for 2-3 years. (Excuse me for just guessing the time periods, but it is known that depressed people lose track of time.) I carried it everywhere in my backpack. You could say I stole it, but I would rather say that everyone was okay with me taking that book, because what I guess is that they have seen that we belong together. I took it to school, shopping, carried it to friends, but it was closed during all this time. Me and the girl I love (I choose not to use “my girlfriend” and I choose not to tell her name) lived together in Denmark, during the time we went to university there. That 1,5 year period was an experience that could have ended up with me killing myself already, but I think only some time later was the final 'I had enough' moment. I opened the book in Denmark, for the first time. It was like deep down I knew, there will be a moment when it will come naturally and that is the reason I had it with me all the time and wasn't gonna open it. I read some, I barely even remember the experience of reading. What I remember is that I felt that I can not process this now. The words were not carrying meaning, I read the word and I was just sitting there like, what? I figured I would like to go somewhere where I can regain myself, regain calmness and my brain processing power. I knew I really wanted to end my suffering in Denmark and at the same time read this book. Some time later, thanks to the people around me, we ended up in this village. I was tired, fat, sad, and my frustration about wanting to fit in and be like everyone else did not change. We spent half a year here, when winter came. This was the final 'I had enough' moment I was talking about. I felt that people are frightened around me and wanting to be by my side all the time so they would see if I am planning anything related to ending my life.

I think it is convenient to guess what happened after this. I spent the days being like a zombie. I wasn't here, nor do I remember anything from this period. However I felt like I have one thing that my soul is craving for. I felt like I can give myself a chance. I prepared days ahead, (like I do with most things) I put the book on the bed every morning, so that I would see it all the time. One night I opened the book. God knows how much time has passed until I finished. I don't remember anything from this period. I cried, smiled, laughed, then felt like I am here and alive. My life has changed. I changed it. The title of the book is Conversations with God, by Neal D. Walsch.

The reason I created this Wordsmith profile is to express my new self. I do not wish to hide, that I am also deeply hopeful, that somehow it finds somebody or even more people, that share the same beliefs I do.

Dear person, if you have read the Conversations with God series, or any of Neal's work, or you feel called to read it, I invite you and I offer you myself to make a community together in which we could live together the way that we feel like we want. To live without the illusions, to live in freedom, in love and in nature. Being one with everyone and with God and finally to create an example that people could see and possibly apply in their lives/community. This is my soul's sole desire. I am here to find people who would like what I would like. Who want to experience what I want to experience and to influence the change of the world.

What I believe in is living life with no expectations, therefore this is only a preference. I would prefer living with you in a community instead of living alone. I would prefer sharing each others happiness instead of me being alone with nobody around me I could tell my joy.

If you have read this so far, I would also like to tell you that I do not want to take Neal's work and redistribute it with my own words. I feel like that part of this creation is done. It is done since the 90's. What I would share on this blog in the following period is my experience of what I believe in, not the truth itself. I believe the truth about life is there in everyone, no book, no guru, no nothing is required to access that. But, if you feel called to read Neal's work and help yourself in a world that is so information based, I recommend you read CWG (1-4). If you have not read it already, you may consider rereading what I wrote in this blog post after you did.

I feel isolated with my beliefs. I would love to see what the creating power of more than one person could do. I would love to help humanity to remember. Remember who they are and I would love to give people back to themselves. As I said, I have no expectations, but my arms are wide open to a big hug if you would like to get to know me. I am here to help with what I can help with, I am here to explain anything you might have questions about. I would love to live life in a way that is without illusions, if your soul was jumping around signaling that it wants the same, I would love to send a big hug to encourage you to listen to it.

Have a beautiful night. I wish to you what you wish for yourself,



from cruisinit

Function EnsureGuiName ($strFolder) { $strFolder = BackslashTrailToFolder($strFolder) [string]$strFolderGui = “Company.Program.Gui\” if ($strFolder.Length -lt $strFolderGui.Length) { [int]$intStartIx = 0 } else { [int]$intStartIx = $strFolder.Length$strFolderGui.Length }

if ($strFolder.Substring($intStartIx) -ne $strFolderGui) { $strFolder += $strFolderGui }

if ($strFolder.Substring(0, “D:\Websites\”.Length) -ne “D:\Websites\”) { $strFolder = “D:\Websites\” + $strFolder }

return $strFolder }

function Expand-File($file, $destination) { if ((Test-Path $destination) -eq $false) { New-Item -Path (Split-Path -Path $destination -Parent) -Name (Split-Path -Path $destination -Leaf) -ItemType directory | Out-Null }

$shell = new-object -com shell.application $zip = $shell.NameSpace($file) foreach($item in $zip.items()) { $shell.Namespace($destination).copyhere($item) } }

function TestRequirementFilesys($astrFileList, $strLog) { [bool]$blnResult = $true

For ($i=0; $i -lt ($astrFileList.Count); $i++) { Write-Host “Testing “ $astrFileList[$i] ” ... “ -NoNewline if ((Test-Path $astrFileList[$i]) -eq $false) { Add-Content -Value ($astrFileList[$i] + ” missing”) -Path $strLog Write-Host “`n” Throw ($astrFileList[$i] + ” missing”) $blnResult = $false } else { Write-Host “OK” } } if ($PSVersionTable.PSVersion.Major -lt 4) { Add-Content -Value “This script requires at least version 4 of PowerShell (in WMF 4, http://www.microsoft.com/en-us/download/details.aspx?id=40855)." -Path $strLog -PassThru $blnResult = $false } return $blnResult }

function GetDevExpressVersionFromProgramVersion($strNewVersion) { [int]$intProgMainVersion = ($strNewVersion.Split(”.”))[0]

switch ($intProgMainVersion)

{ 2 { return 9 } 3 { return 15 } } }

function GetFilePropTags([string]$strPath) { $objShell = New-Object -COMObject Shell.Application [string]$strFolder = Split-Path $strPath [string]$strFile = Split-Path $strPath -Leaf $objShellfolder = $objShell.Namespace($strFolder) $objShellfile = $objShellfolder.ParseName($strFile)

# To get a list of index numbers and their meaning, use this: # 0..287 | Foreach-Object { '{0} = {1}' -f $, $shellfolder.GetDetailsOf($null, $) }

[int]$intExtFilePropsTags = 18 $objShellfolder.GetDetailsOf($objShellfile, $intExtFilePropsTags) }

function GetMsiProdVer([string]$strPath) { $strTagsFromMsi = GetFilePropTags($strPath) [string[]]$astrFileTags = $strTagsFromMsi.Split(”,”) [int[]]$aintVno = ($astrFileTags[1]).split(”.”) [string]::Join(”.”, $aintVno) }

function GetDevExpressVersion([string]$strDevExpressFolder) { $dirDevExpress = Get-ChildItem $strDevExpressFolder *.dll ((Get-ItemProperty ($dirDevExpress[0].FullName)).VersionInfo).FileVersion }


$hshProgramUpdaterSettings = Get-IniContent $IniFileUser $hshProgramUpdaterSettings += Get-IniContent $IniFileWebConfig

[string]$strDeploymentFolder = “D:\Websites\Deploy\” [string]$strLogFolder = $strDeploymentFolder + “UpdateLogs\” + (Get-Date -format “yyyyMMdd.HHmm”) + “h\” if ((Test-Path $strLogFolder) -eq $false) { New-Item -Path (Split-Path -Path $strLogFolder -Parent) -Name (Split-Path -Path $strLogFolder -Leaf) -ItemType directory | Out-Null } [string]$strLog = $strLogFolder + “ProgramUpdater + (Get-Date -format “yyyyMMddHHmm”) + “h.log”

if ( ( $hshProgramUpdaterSettings[“HeaderUser”][“Version”] -ne $strIniVersion ) -or ( $hshProgramUpdaterSettings[“HeaderWebConfig”][“Version”] -ne $strIniVersion ) ) { Add-Content -Value “Wrong version of at least 1 .ini.” -Path $strLog -PassThru Exit }

[string]$strVerMsSql = $hshProgramUpdaterSettings[“MssqlVersionen”][“DEFAULT”] [string]$strHostname = $env:COMPUTERNAME if ($null -ne $hshProgramUpdaterSettings[“MssqlVersionen”][$strHostname]) { $strVerMsSql = $hshProgramUpdaterSettings[“MssqlVersionen”][$strHostname] }

[string]$strWebsiteFolder = $hshProgramUpdaterSettings[“Website folder to Upgrade”][“Folder”] # $strWebsiteFolder.Trim(” “) while ( $strWebsiteFolder.EndsWith(” “) ) { $strWebsiteFolder = $strWebsiteFolder.Substring( 0, ($strWebsiteFolder.Length – 1) ) } $strWebsiteFolder = EnsureGuiName($strWebsiteFolder) [string]$strIISWebsiteName = (Get-Website | Where-Object -Property “PhysicalPath” -EQ -Value (FolderNameWoTrailingBackslash($strWebsiteFolder))).Name [string]$strIISAppPool = (Get-Item (“IIS:\Sites\” + $strIISWebsiteName) | Select-Object applicationPool).applicationPool [string]$strDeployZipFile = $strDeploymentFolder + “Company.Program.CC.Web.Gui.” + $strVerMsSql + ”.zip”

[string]$strOldVersion = ((Get-ItemProperty ($strWebsiteFolder + “bin\Company.Program.BusinessLogik.dll”)).VersionInfo).ProductVersion $msidir = Get-Item ($strDeploymentFolder + “Company.Program.Nb.Setup.” + $strVerMsSql + ”.*.msi”) [string]$strFirstMsiNewVer = $strDeploymentFolder + ($msidir[0].Name) [string]$strNewVersion = GetMsiProdVer($strFirstMsiNewVer) while ($null -eq $strNewVersion -or $strNewVersion -eq ””) { Write-Host “Die Zielversion konnte nicht aus $strFirstMsiNewVer ermittelt werden, bitte hier eingeben ('3.xx.x.xxxxx'):” -ForegroundColor Red $strNewVersion = Read-Host } [string]$strDevExpressFolder = $strDeploymentFolder + “DevExpress{0}\” -f (GetDevExpressVersionFromProgramVersion($strNewVersion)) [string]$strBackupFolder = FolderNameWoTrailingBackslash($strWebsiteFolder) $strBackupFolder += $strBackupFolder += $strOldVersion $strBackupFolder += $strBackupFolder += (Get-Date -format “yyyyMMdd.HHmm”) $strBackupFolder += “h\”

Write-Host -BackgroundColor Gray -ForegroundColor Blue -Object nnEffective Parameters for current run of this script” [string]$strThisScriptVersion = (Get-Help $PSCommandPath -Full).alertSet.alert[0] -split(“`n”) -match “Version: “ -replace(”}”,””)

$objParamTable = New-Object PSObject $objParamTable | Add-Member “Ini Files” ($IniFileUser + ”, “ + $IniFileWebConfig + ” — optional command line parameters”) $objParamTable | Add-Member “Website folder” $strWebsiteFolder $objParamTable | Add-Member “This script's version” $strThisScriptVersion $objParamTable | Add-Member “IIS website name” $strIISWebsiteName $objParamTable | Add-Member “IIS application pool name” $strIISAppPool $objParamTable | Add-Member “Old version” $strOldVersion $objParamTable | Add-Member “New version” $strNewVersion $objParamTable | Add-Member “MS SQL version” $strVerMsSql $objParamTable | Add-Member “Deploy folder” $strDeploymentFolder $objParamTable | Add-Member “Deploy zip file” $strDeployZipFile $objParamTable | Add-Member “DevExpress folder” $strDevExpressFolder $objParamTable | Add-Member “Backup folder” $strBackupFolder $objParamTable | Add-Member “Log folder” $strLogFolder $objParamTable | Format-List

[string[]]$astrFileList = ($strDeploymentFolder + .msi”) $astrFileList += ($strDeploymentFolder + “UpgradeTool-” + $strVerMsSql + ”.exe”) $astrFileList += $strDeployZipFile $astrFileList += ($strDevExpressFolder + “) $astrFileList += ($strWebsiteFolder + “*”) [bool]$blnResult = TestRequirementFilesys $astrFileList $strLog

if ($blnResult -eq $false) { Exit }

Write-Host -BackgroundColor Gray -ForegroundColor Blue -Object “If necessary, stop and run script again. Run '.\ProgramUpdater.ps1 –?' for more details.” Write-Host -BackgroundColor Gray -ForegroundColor Red -Object “If you don't understand what this script does read the <Program> installation guides.”

[string]$strTitle = “ProgramUpdater” [string]$strMessage = “Do you want to go on?” $yes = New-Object System.Management.Automation.Host.ChoiceDescription “&Yes”, <span style="color:#4070a0">"Go on."</span> <span style="color:#19177c">$no</span> = <span style="color:#06287e">New-Object</span> System.<span style="color:#06287e">Management</span>.<span style="color:#06287e">Automation</span>.<span style="color:#06287e">Host</span>.<span style="color:#06287e">ChoiceDescription</span> <span style="color:#4070a0">"&amp;No"</span>, “Exit the script.” $options = System.Management.Automation.Host.ChoiceDescription[] [int]$intResult = $host.ui.PromptForChoice($strTitle, $strMessage, $options, 1) switch ($intResult) { 1 {Exit} }

[string]$strFQDNThisMachine = [System.Net.Dns]::GetHostByName((hostname)).HostName Add-Content -Value (“Computer name (FQDN): “ + $strFQDNThisMachine) -Path $strLog Add-Content -Value (“Script starter: “ + $env:USERDOMAIN + “\” + $env:USERNAME) -Path $strLog Add-Content -Value (“Website folder: “ + $strWebsiteFolder) -Path $strLog Add-Content -Value (“Deploy folder: “ + $strDeploymentFolder) -Path $strLog Add-Content -Value (“Dev express folder: “ + $strDevExpressFolder) -Path $strLog Add-Content -Value (“Backup folder: “ + $strBackupFolder) -Path $strLog Add-Content -Value (“New version: “ + $strNewVersion) -Path $strLog Add-Content -Value (“IIS website name: “ + $strIISWebsiteName) -Path $strLog Add-Content -Value (“IIS application pool name: “ + $strIISAppPool) -Path $strLog Add-Content -Value (“MS SQL version: “ + $strVerMsSql) -Path $strLog Add-Content -Value (nn”) -Path $strLog

# Out-Null: Do not continue before this line has been completely executed Stop-Website -Name $strIISWebsiteName | Out-Null Stop-WebAppPool -Name $strIISAppPool | Out-Null Add-Content -Value (“Attempted to stop IIS website “ + $strIISWebsiteName + + (Get-Date -format “yyyyMMddHHmm”)) -Path $strLog -PassThru Add-Content -Value (“Attempted to stop IIS application pool “ + $strIISAppPool + + (Get-Date -format “yyyyMMddHHmm”)) -Path $strLog -PassThru

Add-Content -Value (“Attempting to ensure apppool” + $strIISAppPool + ” and website “ + $strIISWebsiteName + ” are stopped. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Add-Content -Value (“Apppool “ + $strIISAppPool + ” status: “ + (Get-WebAppPoolState $strIISAppPool).Value + ”. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru Add-Content -Value (“Website “ + $strIISWebsiteName + ” status: “ + (Get-WebsiteState $strIISWebsiteName).Value + ”. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

“Waiting” | Out-Null

[int]$intSec = 0 while ( ( (Get-WebAppPoolState $strIISAppPool).Value -ne “Stopped” ) -and ( (Get-WebsiteState $strIISWebsiteName).Value -ne “Stopped” ) ) { Start-Sleep 2 $intSec += 2 Add-Content -Value (“Waited “ + $intSec + ” of 60 seconds. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru if ($intSec -eq 60) { Add-Content -Value (“apppool and website apparently still running, exiting. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru Exit } }

[string]$strNewVerFolder = FolderNameWoTrailingBackslash($strWebsiteFolder) $strNewVerFolder += “_New\”

Expand-File -file $strDeployZipFile -destination $strNewVerFolder | Out-Null Add-Content -Value (“Unzipped “ + $strDeployZipFile + ” “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Remove-Item -Path ($strWebsiteFolder + “bin\DevExpress) -Force -Recurse | Out-Null Add-Content -Value (“Deleted “ + $strWebsiteFolder + “bin\DevExpress “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

if ((Test-Path $strNewVerFolder) -eq $false) { New-Item -Path (Split-Path -Path $strNewVerFolder -Parent) -Name (Split-Path -Path $strNewVerFolder -Leaf) -ItemType directory | Out-Null } if ((Test-Path $strBackupFolder) -eq $false) { New-Item -Path (Split-Path -Path $strBackupFolder -Parent) -Name (Split-Path -Path $strBackupFolder -Leaf) -ItemType directory | Out-Null }

Copy-Item -Path ($strDevExpressFolder + ) -Destination ($strNewVerFolder + “bin”) -Force | Out-Null Add-Content -Value (“Copied “ + $strDevExpressFolder + “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

try { Move-Item -Path ($strWebsiteFolder + ) -Destination $strBackupFolder -Exclude “Log”,“Setup”,“Temp”,“logo” -Force -ErrorAction SilentlyContinue | Out-Null
} catch { } Add-Content -Value (“Moved “ + $strWebsiteFolder +
except Log\, Setup\, Temp\, logo\ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Copy-Item -Path ($strWebsiteFolder + “*”) -Destination $strBackupFolder -Force -Recurse | Out-Null Add-Content -Value (“Copied “ + $strWebsiteFolder + “\Log\, ...\Setup\, ...\Temp\, ...\logo\ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

AdaptWebConfig $strNewVerFolder $strBackupFolder $strNewVersion $strLog $hshProgramUpdaterSettings

Remove-Item -Path ($strWebsiteFolder + “Setup\Company.Program.Nb.Setup..msi”) -Force | Out-Null Add-Content -Value (“Deleted “ + $strWebsiteFolder + “Setup\Company.Program.Nb.Setup..msi “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

[string]$strMsiCopyPath = $strWebsiteFolder + “Setup\msi” if ((Test-Path $strMsiCopyPath) -eq $false) { New-Item -Path (Split-Path -Path $strMsiCopyPath -Parent) -Name (Split-Path -Path $strMsiCopyPath -Leaf) -ItemType directory | Out-Null } else { Remove-Item -Path ($strMsiCopyPath + “\Company.Program.Nb.Setup.*.msi”) -Force | Out-Null }

[string]$strWebConfigMsiPath = $strMsiCopyPath + “\web.config” if ((Test-Path $strWebConfigMsiPath) -eq $false) { $strWebConfigMsiContent | Out-File $strWebConfigMsiPath -Force -Encoding utf8 [string]$strWebConfigMsiAttr = (Get-Item -Force $strWebConfigMsiPath).Attributes -join(”,”) if ($strWebConfigMsiAttr -notmatch(“Hidden”)) { (Get-Item -Force $strWebConfigMsiPath).Attributes = $strWebConfigMsiAttr + ”,Hidden” } Add-Content -Value (“Created “ + $strWebConfigMsiPath + ” “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru }

Add-Content -Value (“Deleted “ + $strWebsiteFolder + “Setup\msi\Company.Program.Nb.Setup.*.msi “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Remove-Item -Path ($strWebsiteFolder + “Setup\UpgradeLog.txt”) -Force | Out-Null Add-Content -Value (“Deleted “ + $strWebsiteFolder + “Setup\UpgradeLog.txt “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Remove-Item -Path ($strWebsiteFolder + “Setup\UpgradeTool-” + $strVerMsSql + ”.exe”) -Force | Out-Null Add-Content -Value (“Deleted “ + $strWebsiteFolder + “Setup\UpgradeTool-” + $strVerMsSql + ”.exe “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Remove-Item -Path ($strWebsiteFolder + “Log*.) -Force | Out-Null Add-Content -Value (“Deleted “ + $strWebsiteFolder + “Log*. “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

while ((Get-ChildItem $strNewVerFolder).Length -gt 0) { Move-Item -Path ($strNewVerFolder + ) -Destination $strWebsiteFolder -Force -ErrorAction SilentlyContinue | Out-Null } Add-Content -Value (“Moved “ + $strNewVerFolder + “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Remove-Item -Path ($strNewVerFolder) -Force -Recurse | Out-Null Add-Content -Value (“Deleted “ + $strNewVerFolder + ” “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Copy-Item -Path ($strDeploymentFolder + “Company.Program.Nb.Setup.” + $strVerMsSql + .msi”) -Destination ($strWebsiteFolder + “Setup”) -Force | Out-Null Add-Content -Value (“Copied “ + $strDeploymentFolder + “Company.Program.Nb.Setup.” + $strVerMsSql + .msi to Setup\” + ” “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Copy-Item -Path ($strDeploymentFolder + “Company.Program.Nb.Setup.” + $strVerMsSql + .msi”) -Destination ($strWebsiteFolder + “Setup\msi”) -Force | Out-Null Add-Content -Value (“Copied “ + $strDeploymentFolder + “Company.Program.Nb.Setup.” + $strVerMsSql + .msi to Setup\msi\” + ” “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

Copy-Item -Path ($strDeploymentFolder + “UpgradeTool-” + $strVerMsSql + ”.exe”) -Destination ($strWebsiteFolder + “Setup”) -Force | Out-Null Add-Content -Value (“Copied “ + $strDeploymentFolder + “UpgradeTool-” + $strVerMsSql + ”.exe” + ” “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

[string]$strTitle = “ProgramUpdater” [string]$strMessage = “Do you want the script to copy the path to the web.config to clipboard, for UpgradeTool? “ $strMessage += “This will overwrite current contents of clipboard.” $yes = New-Object System.Management.Automation.Host.ChoiceDescription “&Yes”, <span style="color:#4070a0">"Copy the path, overwrite the clipboard contents."</span> <span style="color:#19177c">$no</span> = <span style="color:#06287e">New-Object</span> System.<span style="color:#06287e">Management</span>.<span style="color:#06287e">Automation</span>.<span style="color:#06287e">Host</span>.<span style="color:#06287e">ChoiceDescription</span> <span style="color:#4070a0">"&amp;No"</span>, “Do not copy anything, just start the UpgradeTool.” $options = System.Management.Automation.Host.ChoiceDescription[] [int]$intResult = $host.ui.PromptForChoice($strTitle, $strMessage, $options, 0) switch ($intResult) { 0 { [Windows.Forms.Clipboard]::SetText($strWebsiteFolder + “web.config”) } }

$UpgradeToolPid = (Start-Process -FilePath ($strWebsiteFolder + “Setup\UpgradeTool-” + $strVerMsSql + ”.exe”) -Wait -PassThru).Id try { Wait-Process -Id $UpgradeToolPid -ErrorAction SilentlyContinue } catch {

Copy-Item -Path ($strWebsiteFolder + “Setup\UpgradeLog.txt”) -Destination ($strLogFolder) -Force | Out-Null

Start-Website -Name $strIISWebsiteName Start-WebAppPool -Name $strIISAppPool | Out-Null # “Started IIS website ” + $strIISWebsiteName + “ ” + (Get-Date -format “yyyyMMddHHmm”) -> PassThru # “Started IIS application pool ” + $strIISAppPool + “ ” + (Get-Date -format “yyyyMMddHHmm”) Add-Content -Value (“Attempting to start IIS website “ + $strIISWebsiteName + ” “ + (Get-Date -format “yyyyMMddHHmm”)) -Path $strLog -PassThru | Out-Null Add-Content -Value (“Attempting to start IIS application pool “ + $strIISAppPool + ” “ + (Get-Date -format “yyyyMMddHHmm”)) -Path $strLog -PassThru | Out-Null

“Waiting” | Out-Null

[int]$intSec = 0 while ( ( (Get-WebAppPoolState $strIISAppPool).Value -ne “Started” ) -and ( (Get-WebsiteState $strIISWebsiteName).Value -ne “Started” ) ) { Start-Sleep 2 $intSec += 2 Add-Content -Value (“Waited “ + $intSec + ” of 60 seconds. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru if ($intSec -eq 60) { Add-Content -Value (“apppool and website not running, upgrader failed, result mail might fail. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru break } }

Add-Content -Value (“Apppool “ + $strIISAppPool + ” status: “ + (Get-WebAppPoolState $strIISAppPool).Value + ”. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru Add-Content -Value (“Website “ + $strIISWebsiteName + ” status: “ + (Get-WebsiteState $strIISWebsiteName).Value + ”. _ “ + (Get-Date -format “yyyyMMdd_HHmm”)) -Path $strLog -PassThru

$Error | Select-Object * | Out-File ($strLogFolder + “ProgramUpdater.errors” + (Get-Date -format “yyyyMMdd.HHmm”) + “h.log”)

MailResult $strLogFolder $hshProgramUpdaterSettings



from cruisinit

Automates upgrading a .NET and ASP.NET web application on IIS with MSSQL backend and .NET client installers. Chooses correct deployment packages, starts data model upgrade, builds a new web.config with the new settings from deployment packages and by selectively copying the installation specific, client side settings from the old files by attrib name.

#Requires -Version 4 #Requires -RunAsAdmin

# Todo: $strNewVersion, zunaechst aus .msi-Props ausgelesen, aus dann entpackter Anwendung -> bin\ -> .dll neu auslesen, falls nicht zueinander passende Deploymentpakete .zip und .msi zusammenkopiert wurden [string]$strNewVersion = ((Get-ItemProperty ($strNewVerFolder + “bin&lt;filename>.dll”)).VersionInfo).ProductVersion fuehrt aktuell zu Mosern ueber mangelnde Zugriffsrechte # Todo: Optische Aufbereitung des Mailbodys oder Attachments ueber CC-Webservice

<# .SYNOPSIS Update <Program> Standard. Automates upgrading a .NET and ASP.NET web application on IIS with MSSQL backend and .NET client installers. Chooses correct deployment packages, starts data model upgrade, builds a new web.config with the new settings from deployment packages and by selectively copying the installation specific, client side settings from the old files by attrib name. .DESCRIPTION Update <Program> Standard Syntax: [D:\Websites\Deploy\UpdaterScript]ProgramUpdaterAsAdmin.lnk (with a script file path in the command line saying D:\Websites\Deploy\UpdaterScript\ProgramUpdater.ps1. The default paths (see below) to both .INIs will usually work. If you need to supply an absolute path to one or boths .INIs, edit ProgramUpdaterAsAdmin.lnk's command line along this syntax note: D:\Websites\Deploy\UpdaterScript\ProgramUpdater.ps1 [[-IniFileUser] <String>] [[-IniFileWebConfig] <String>] [<CommonParameters>] ) Use this internal helper at your own risk. Addressed audience are informed IT workers. The author cannot be held liable for loss of data by the use of this script. * This script requires PowerShell version 4 (in WMF, but if you need update anyway, install WMF 5, https://www.microsoft.com/en-us/download/confirmation.aspx?id=54616&6B49FDFB-8E5B-4B07-BC31-15695C5A2143=1). * This script requires to be run as admin. * You may supply absolute paths inc. file name to the two .ini files as the only parameter. Use “ ” if path contains blanks. * Run without parameter, this script searches its .ini at D:\Websites\Deploy\UpdaterScript\ProgramUpdaterSettingsuser.ini plus D:\Websites\Deploy\UpdaterScript\ProgramUpdaterSettingsweb.config.ini. (In fact, this script retrieves its own full path and replaces “.ps1” with “Settingsuser.ini” / “Settingsweb.config.ini”, and this will regularly lead to the paths mentioned above.) * Your website folder path in Settingsuser.ini must start with “D:\Websites\“. If it does not, the script adds this automatically. * Your website folder path in Settingsuser.ini must end with “\Company.Program.Gui\“. If it does not, the script adds this automatically. * Deployment folder is always D:\websites\deploy. Copy your deployment packages (.ZIPs, .MSIs, UpgradeTool.exe) into this folder. * The current default for the MS SQL version (part of deployment packages' names) is 2008 (means: 2008 and 2008 R2). You can define other versions (allowed: 2012, 2014) by machine name in Settingsuser.ini, and you can change the default in Settingsuser.ini. When the script lists the detected parameters and paths and asks for your permission to go on, check the MS SQL version (check everything). If the version does not match the <Program> instance of SQL Server on the customer's machine, stop the script and edit Settingsuser.ini before you start it again. * To not overwrite user settings during deployment, this script is shipped with ProgramUpdaterSettingsusermaster.ini used for dev tests. You can check this e.g. for version updates. You are warned if script and ini versions (inside) don't fit. * The old version is detected from <WebsiteFolder>\bin&lt;FirstDll>.dll's file properties ('Product version'). * The new version is detected from D:\websites\deploy&lt;FirstMsi>.msi's file properties ('Tags'). * The backup folder is always <WebsiteFolder><OldVersion><DateTime>. * The script log folder is always D:\websites\deploy\UpdateLogs&lt;DateTime>. You will find some explicitly logged results, powershell script errors, and the UpgradeTool log in there. * DevExpress deployment folder is always D:\websites\deploy\DevExpress&lt;Version>. Ensure the DevExpress runtime files are copied to this folder before. * The script stops the IIS website for the duration of its run. .PARAMETER IniFileUser Default: <ThisScriptsPath>&lt;ThisScriptsNameWithoutExtension>Settingsuser.ini (almost always D:\Websites\Deploy\UpdaterScript\ProgramUpdaterSettingsuser.ini). .PARAMETER IniFileWebConfig Default: <ThisScriptsPath>&lt;ThisScriptsNameWithoutExtension>Settingsweb.config.ini (almost always D:\Websites\Deploy\UpdaterScript\ProgramUpdaterSettings_web.config.ini). .EXAMPLE PS C:\util> .\ProgramUpdaterAsAdmin.lnk # This script is shipped with ProgramUpdaterAsAdmin.lnk, you should prefer this. If you need to change the call e.g. to call another .ini, edit the .lnk. .NOTES Author: ps@<mydomain>.de Date: 2 June 2016 to 24 Jan 2019 Todo: $strNewVersion, zunaechst aus .msi-Props ausgelesen, aus dann entpacktem CC -> bin\ -> .dll neu auslesen, falls nicht zueinander passende Deploymentpakete .zip und .msi zusammenkopiert wurden [string]$strNewVersion = ((Get-ItemProperty ($strNewVerFolder + “bin\Company.Program.BusinessLogik.dll”)).VersionInfo).ProductVersion fuehrt aktuell zu Mosern ueber mangelnde Zugriffsrechte Todo: Optische Aufbereitung des Mailbodys oder Attachments ueber Webservice Version: — check with TFS


param ( [Parameter(Position=0)] # [string]$strWebsiteFolder = “D:\Websites\Company\Company.Program.Gui\” [string]$IniFileUser = $PSCommandPath -replace(”.ps1”,“Settingsuser.ini”), [Parameter(Position=1)] # [string]$strWebsiteFolder = “D:\Websites\Company\Company.Program.Gui\” [string]$IniFileWebConfig = $PSCommandPath -replace(”.ps1”,“Settingsweb.config.ini”)




if ($IniFileUser -in ($null, ””)) { [string]$IniFileUser = $PSCommandPath -replace(”.ps1”,“Settingsuser.ini”) } if ($IniFileUserWebConfig -in ($null, ””)) { [string]$IniFileWebConfig = $PSCommandPath -replace(”.ps1”,“Settingsweb.config.ini”) }

[string]$strWebConfigMsiContent = @” <?xml version=“1.0” encoding=“UTF-8”?> <configuration> <system.webServer> <directoryBrowse enabled=“true” showFlags=“Date, Time, Size, Extension, LongDate” /> </system.webServer> </configuration> ”@

[string]$strIniVersion = “1.5_20181019”

# if ($psise -ne $null) { $strWebsiteFolder = “Company” } # Edit the $strWebsiteFolder part of this line to run this script in ISE.

Add-Type -AssemblyName System.Windows.Forms Import-Module WebAdministration

#region Functions

Function Get-IniContent {
<# .Synopsis Gets the content of an INI file .Description Gets the content of an INI file and returns it as a hashtable .Notes Author : Oliver Lipkau <oliver@lipkau.net> Blog : http://oliver.lipkau.net/blog/ Source : https://github.com/lipkau/PsIni http://gallery.technet.microsoft.com/scriptcenter/ea40c1ef-c856-434b-b8fb-ebd7a76e8d91 Version : 1.0 – 2010/03/12 – Initial release 1.1 – 2014/12/11 – Typo (Thx SLDR) Typo (Thx Dave Stiff) #Requires -Version 2.0 .Inputs System.String .Outputs System.Collections.Hashtable .Parameter FilePath Specifies the path to the input file. .Example $FileContent = Get-IniContent “C:\myinifile.ini” —————– Description Saves the content of the c:\myinifile.ini in a hashtable called $FileContent .Example $inifilepath | $FileContent = Get-IniContent —————– Description Gets the content of the ini file passed through the pipe into a hashtable called $FileContent .Example C:\PS>$FileContent = Get-IniContent “c:\settings.ini” C:\PS>$FileContent[“Section”][“Key”] —————– Description Returns the key “Key” of the section “Section” from the C:\settings.ini file .Link Out-IniFile #>

[ValidateScript({(Test-Path $) -and ((Get-Item $).Extension -eq ”.ini”)})]

Write-Verbose ”$($MyInvocation.MyCommand.Name):: Function started”

Write-Verbose ”$($MyInvocation.MyCommand.Name):: Processing file: $Filepath”

$ini = @{}
switch -regex -file $FilePath
”^[(.+)]$” # Section {
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
”^(;.)$” # Comment {
if (!($section))
$section = “No-Section”
$ini[$section] = @{}
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = “Comment” + $CommentCount
$ini[$section][$name] = $value
=\s(.)” # Key {
if (!($section))
$section = “No-Section”
$ini[$section] = @{}
$name,$value = $matches[1..2]
$ini[$section][$name] = $value

Write-Verbose ”$($MyInvocation.MyCommand.Name):: Finished Processing file: $FilePath”
Return $ini

Write-Verbose ”$($MyInvocation.MyCommand.Name):: Function ended” } # Function Get-IniContent

function CopyWebConfigAttrValue($rootNew, $rootOld, $strSection, $strKeyName, $strLog) { [string]$strKeyValueRead = $rootOld.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' [string]$strKeyValueReadNew = $rootNew.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' if ( $strKeyValueReadNew -in ($null, ””) ) { $newItem = $rootNew.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[1]”).Clone() $newItem.SetAttribute(“key”,$strKeyName) $newItem.SetAttribute(“value”,$strKeyValueRead) $rootNew.SelectSingleNode(”//$strSection”).AppendChild($newItem) [string]$strMsg = “web.config: Setting '$strSection.$strKeyName' did not exist in webref.config (you should maintain webref.config) and has been automatically created by this script in target web.config, value has been set to '$strKeyValueRead', from former version's web.config. “ + (Get-Date -format “yyyyMMddHHmm”) Add-Type -AssemblyName PresentationFramework [System.Windows.MessageBox]::Show($strMsg,'<Program> Updater: New Setting','OK','Error') Add-Content -Value $strMsg -PassThru -Path $strLog } else { $rootNew.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' = $strKeyValueRead } [string]$strKeyValueWritten = $rootNew.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' switch ($strKeyName) { 'DbVerbindungString' { Add-Content -Value ($strKeyName + “: “ + $strKeyValueWritten + (Get-Date -format “yyyyMMddHHmm”)) -PassThru -Path $strLog } { $ -in 'SystemAccountPw', 'SmtpPw' } { $strKeyValueRead = ”(confidential)” $strKeyValueWritten = ”(confidential)” } } Add-Content -Value (“web.config: Setting '$strSection.$strKeyName': read '$strKeyValueRead', written '$strKeyValueWritten' “ + (Get-Date -format “yyyyMMddHHmm”)) -PassThru -Path $strLog } # function CopyWebConfigAttrValue

function SetWebConfigAttrValue($root, $strSection, $strKeyName, $strKeyValue, $strLog) { $strKeyValueRead = $root.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' if ( $strKeyValueRead -in ($null, ””) ) { $newItem = $root.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[1]”).Clone() $newItem.SetAttribute(“key”,$strKeyName) $newItem.SetAttribute(“value”,$strKeyValue) $rootNew.SelectSingleNode(”//$strSection”).AppendChild($newItem) [string]$strMsg = “web.config: Setting '$strSection.$strKeyName' did not exist in webref.config (you should maintain webref.config) and has been automatically created by this script in target web.config, value has been set to '$strKeyValueRead', from former version's web.config. “ + (Get-Date -format “yyyyMMdd_HHmm”) Add-Type -AssemblyName PresentationFramework [System.Windows.MessageBox]::Show($strMsg,'<Program> Updater: New Setting','OK','Error') Add-Content -Value $strMsg -PassThru -Path $strLog } else { $root.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' = $strKeyValue }

[string]$strKeyValueWritten = $root.SelectSingleNode(”//$strSection”).SelectSingleNode(“add[@key='$strKeyName']/@value”).'#text' switch ($strKeyName) { 'DbVerbindungString' { Add-Content -Value ($strKeyName + “: “ + $strKeyValueWritten + (Get-Date -format “yyyyMMddHHmm”)) -PassThru -Path $strLog } { $ -in 'SystemAccountPw', 'SmtpPw' } { $strKeyValueRead = ”(confidential)” $strKeyValueWritten = ”(confidential)” } } Add-Content -Value (“web.config: Setting '$strSection.$strKeyName' was set to '$strKeyValueWritten' “ + (Get-Date -format “yyyyMMdd_HHmm”)) -PassThru -Path $strLog } # function SetWebConfigAttrValue

# copy authorization keys – http://michlstechblog.info/blog/powershell-some-basic-xml-handling-with-powershell-and-net/ function CopyWebConfigAuthorizationNode($rootNew, $rootOld, $xmlConfigNew, $strLog) {

$rootNew.'system.web'.RemoveChild($rootNew.'system.web'.SelectSingleNode(“authorization”)) | Out-Null $newNode = $xmlConfigNew.ImportNode($rootOld.'system.web'.SelectSingleNode(“authorization”), $true) $rootNew.'system.web'.AppendChild($newNode) | Out-Null Add-Content -Value (“web.config: Copied 'authorization' section. “ + (Get-Date -format “yyyyMMdd_HHmm”)) -PassThru -Path $strLog


function AdaptWebConfig([string]$strNewVerFolder, [string]$strOldVerFolder, [string]$strNewVersion, [string]$strLog, $hshSettings) {

Rename-Item ($strNewVerFolder + “web_ref.config”) “web.config” [string]$strOldVerConfig = $strOldVerFolder + “web.config” [string]$strNewVerConfig = $strNewVerFolder + “web.config”

Add-Content -Value (“Old web.config: “ + $strOldVerConfig) -Path $strLog -PassThru Add-Content -Value (“New web.config: “ + $strNewVerConfig) -Path $strLog -PassThru

“Adapting $strNewVerConfig”

[xml]$xmlConfigOld = Get-Content $strOldVerConfig [xml]$xmlConfigNew = Get-Content $strNewVerConfig $rootOld = $xmlConfigOld.getDocumentElement() $rootNew = $xmlConfigNew.getDocumentElement()

[int]$intProgMainVersion = ($strNewVersion.Split(”.”))[0]

switch ($intProgMainVersion) { 2 { # NotebookVersion SetWebConfigAttrValue $rootNew “appSettingsNotebook” “NotebookVersion” $strNewVersion $strLog

# <authorization> CopyWebConfigAuthorizationNode $rootNew $rootOld $xmlConfigNew $strLog

# appSettings foreach ($key in $hshSettings[“web.config v2 appSettings”].Keys) { CopyWebConfigAttrValue $rootNew $rootOld “appSettings” $hshSettings[“web.config v2 appSettings”][$key] $strLog }

# appSettingsNotebook foreach ($key in $hshSettings[“web.config v2 appSettingsNotebook”].Keys) { CopyWebConfigAttrValue $rootNew $rootOld “appSettingsNotebook” $hshSettings[“web.config v2 appSettingsNotebook”][$key] $strLog }

} # switch 2

3 { # appSettings foreach ($key in $hshSettings[“web.config v3 appSettings”].Keys) { CopyWebConfigAttrValue $rootNew $rootOld “appSettings” $hshSettings[“web.config v3 appSettings”][$key] $strLog }

# appSettingsNotebook foreach ($key in $hshSettings[“web.config v3 appSettingsNotebook”].Keys) { CopyWebConfigAttrValue $rootNew $rootOld “appSettingsNotebook” $hshSettings[“web.config v3 appSettingsNotebook”][$key] $strLog }

} # switch 3 } # switch

$xmlConfigNew.Save($strNewVerConfig) | Out-Null

[string]$strNewVerConfigBak = $strNewVerFolder + “BakCfg\” if ((Test-Path $strNewVerConfigBak) -eq $false) { New-Item -Path (Split-Path -Path $strNewVerConfigBak -Parent) -Name (Split-Path -Path $strNewVerConfigBak -Leaf) -ItemType directory | Out-Null } $strNewVerConfigBak += (“web.config.” + (Get-Date -format “yyyyMMdd.HHmm”) + “h”) Copy-Item $strNewVerConfig $strNewVerConfigBak

} # function AdaptWebConfig

function MailResult ($strLogFolder, $hshSettings) { [string]$ThisScriptCopy = $PSCommandPath + ”.txt” Copy-Item $PSCommandPath $ThisScriptCopy -Force $dirLogs = Get-ChildItem ($strLogFolder + “*”)

[string[]]$astrAttachments = @() $astrAttachments += $ThisScriptCopy foreach ($strLogFile in $dirLogs) { $astrAttachments += $strLogFile.FullName }

[string]$strBody = “ProgramUpdater was started by “ + $env:USERDOMAIN + “\” + $env:USERNAME $strBody += ” on “ + [System.Net.Dns]::GetHostByName((hostname)).HostName

foreach ($strAttachment in $astrAttachments) { $strBody += nn ====================” $strBody += nn “ + $strAttachment $strBody += Get-Content $strAttachment }

[string[]]$astrMailRecipients = @() foreach ($key in $hshSettings[“Result mail”].Keys) { if ($key -like “To*”) { $astrMailRecipients += $hshSettings[“Result mail”][$key] } }

if ($hshSettings[“Result mail”][“Use”] -eq “1”) { Send-MailMessage -To $astrMailRecipients -From <span style="color:#19177c">$hshSettings</span>[<span style="color:#4070a0">"Result mail"</span>][<span style="color:#4070a0">"From"</span>] -Subject “ProgramUpdater” -Body <span style="color:#19177c">$strBody</span> -SmtpServer $hshSettings[“Result mail”][“SmtpServer”] -Attachments <span style="color:#19177c">$astrAttachments</span> -ErrorAction SilentlyContinue }

if ($hshSettings[“Result mail WS”][“Use”] -eq “1”) { $pw = ConvertTo-SecureString -String $hshSettings[“Result mail WS”][“WsUserPw”] -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential $hshSettings[“Result mail WS”][“WsUserName”], $pw $wsSmtp = New-WebServiceProxy $hshSettings[“Result mail WS”][“WsUrl”] -Credential $creds foreach ($Addr in $astrMailRecipients) { $wsSmtp.SendeEmailMitStandardAbsender($Addr,””,””,“ProgramUpdater”,$strBody) } } } # function MailResult

Function BackslashTrailToFolder ($strFolder) { if ( ($strFolder.Substring($strFolder.Length – 1)) -ne “\” ) { $strFolder += “\” return $strFolder } }

Function FolderNameWoTrailingBackslash ($strFolder) { if ( ($strFolder.Substring($strFolder.Length – 1)) -eq “\” ) { $strFolder = $strFolder.Substring(0, $strFolder.Length – 1) return $strFolder } }


from cruisinit

# Monitor-hosts.ps1. Best run as Scheduled Task at machine startup and repeated every 15 min. Is intended to detect changes even when you have not been online when your hosts has been tampered with. # ex.: <Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command> # <Arguments>-NoExit -NoProfile -ExecutionPolicy ByPass -File C:\util\Monitor-hosts.ps1</Arguments> [string]$strHostsLastPath = “c:\util\hosts.$env:COMPUTERNAME.last.xml” # Ensure directory for hash store file if ( ( Test-Path (Split-Path $strHostsLastPath -Parent) ) -eq $false ) { mkdir (Split-Path $strHostsLastPath -Parent) } if ( (Test-Path $strHostsLastPath) -eq $false ) # (Re) Initialize hash store file { (Get-WmiObject Win32_OperatingSystem).Version (Get-Hash C:\Windows\System32\drivers\etc\hosts -Algorithm SHA512).ToString() | Export-Clixml $strHostsLastPath # Get-Hash mit Community Extension in Win 7, Get-FileHash in Windows 10. Win 8? Set-ItemProperty $strHostsLastPath -Name IsReadOnly -Value $true } else # compare stored hash with current { [string]$strHashNow = (Get-Hash C:\Windows\System32\drivers\etc\hosts -Algorithm SHA512).ToString() # Get-Hash mit Community Extension in Win 7, Get-FileHash in Windows 10. Win 8? [xml]$xmlHashLast = gc $strHostsLastPath if ($xmlHashLast.Objs.S -ne $strHashNow) { Add-Type -AssemblyName System.Windows.Forms [string]$strMsg = “Check hosts, if you haven't edited hosts yourself in the last 15 min. Most likely hosts' hash has changed. If so, restore your hosts from backup and delete $strHostsLastPath (read-only) to reset this monitor.” [string]$strTitle = “hosts monitor” $void = [System.Windows.Forms.MessageBox]::Show($strMsg,$strTitle,[System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Exclamation) } else { “Hashs ident” } }


from Welcome to the Saladhax Blog!

News via RSS: Great replacement for Google News

Ever since I got my first smart-device, I've almost always had some sort of Google app for news. I used Google Now for a while on my iPod and later on my phone once I got my first actual smartphone. I liked how it showed personalized and relevant information, as well as news that was related to my interests. And if I didn't like what popped up on there, I could just swipe it away, and less stuff like that would show up on the feed. Then they changed it to Google Discover or Google Feed or whatever the hell they're calling it nowadays, and things changed. It was harder to personalize what you saw, there were separate feeds for news and other stuff (weather, events, etc.) and I just didn't like it as much. Then, Google News came around and I started using it. It still wasn't as easier to personalize, and it didn't show the other stuff, but I still liked it! But then I turned on some privacy features in my Google account, and the news didn't feel as personalized as it once did, since it wasn't collecting as much data. Both services also started ignoring the sites I said I didn't want news from anymore. These were usually sites that felt like they had a bunch of click-bait titles and stuff like that. But no matter how many times I hit the button for ignoring those sites, they would still pop up.

Since all of this, I've been working to try and find other ways to get my news. Flipboard was a good app, but I still didn't like it as much. And I just couldn't find another app I liked as much as the Google options. But now, I think I've found a new option in some older tech: an RSS feed. I got the idea from a podcast I was listening to called Hacker Culture by J.R. Swab, where he talked about the same thing in one of his episodes. This intrigued me, so I decided to give it a shot. I downloaded Feeder from F-Droid, and found some RSS feeds that interested me. I feel like I have the perfect amount of customization as far as news feeds go. I can get them from any news site I choose, and I can even see when people post on YouTube! It also allows me to keep those pesky sites out of the feed. For example, I don't like getting news from Forbes or Express.co.uk, because I feel like their article titles are too click-baity, and sometimes tend to mislead the reader and say something different than what the article does. With the Google options, they would sometimes still show up even if I said I didn't want stories from them. But with the RSS feed, I can just not add their feed, and not get their stories. I haven't used this too much yet, but I'm really liking it so far since no one has to collect my data, and I can still get the nice personalized news feed I like.

This is post 12 of #100daystooffload


from Bouvade


Petit fantasme de secrétaire...

Aujourd'hui Stéphane, qui était en charge d'un gros dossier est dans mon bureau pour me faire le bilan. La réunion est très productive et l'excellent travail de Stéphane a permis à la boite de conquérir un nouveau marché et augmenter ses profits. Je suis très content de Stéphane. Je voudrais le remercier le plus chaleureusement possible. Ayant déjà remarqué ses petits regards sur les fesses de ma secrétaire, je décrochais immédiatement mon téléphone pour lui demander de venir immédiatement dans mon bureau. Cette dernière arrive en quelques secondes, dans cette belle robe de printemps bleu nuit à petits pois blancs. Je l'aime bcp, car elle offre grâce à un très généreux décolleté en V une vue imprenable sur la naissance de sa si agréable poitrine... Et puis sa coupe ajustée, suit délicatement son appétissante silhouette, en laissant ses genoux et ses jambes découvertes... Perchée sur une jolie paire d’escarpins noirs, elle est à ainsi à croquer.

Pour répondre à sa question à l’entrée dans le bureau, je déclare : « Merci de nous rejoindre, figurez-vous que Stéphane a accompli un travail formidable. Je voulais vous en faire part ! Je pense que cela mérite une récompense. Je pensais bien sûr à une prime, mais j’aurais aimé qq chose de plus chaleureux. ». La secrétaire s’assois alors sur le rebord de mon bureau, appuyée sur une main, tournée à moitié vers moi et l’autre moitié vers Stéphane... Cela ayant pour effet de remonter cette belle robe sur ses cuisses croisées, dans un effet dont je suis persuadé qu’il était volontaire avant de déclarer : « Fêter ça ce midi avec une table dans un bon restaurant serait sympathique, mais j’ai vu sur le planning que vous aviez tous les deux des rendez-vous prévus tôt cet après midi... ». Cette diablesse se caresse du bout des doigts de sa main libre le bord du décolleté de façon aguicheuse, ce qui semble ne pas laisser de marbre Stéphane, qui se tortille sur sa chaise pour très probablement tenter de masquer son émoi...

Se tournant vers moi en caressant lentement sa poitrine à travers le décolleté, avant de déboutonner un par un les boutons du décolleté de sa robe, elle me demande « M. le Directeur, je pense que Stéphane ne serait pas insensible aux félicitations de la part de quelqu’un totalement dévouée à l’entreprise. ». Avec le sourire au coin des lèvres je réponds : « Et bien en effet, je pense que vous seriez la mieux placée pour le remercier au nom de toute l’entreprise, et lui démontrer ainsi que le dévouement ici, paye ! Je vous en pris, allez y ! ». C’est alors que sans aucune pudeur, mais avec une malice totale au coin des lèvres comme au fond du regard, qu’elle sort sa délicieuse poitrine de son décolleté pour la caresser sensuellement en se tournant cuisses ouvertes vers Stéphane. Ce dernier n’en revient pas et ne peut cette fois plus dissimuler la très sévère érection sous son pantalon. « Stéphane, le Directeur m’a chargé de vous présenter les plus chaleureux remerciements au nom de toute la boîte. J’espère que cela vous touchera. C’est amplement mérité ! Relaxez vous Stéphane, laissez vous aller, aujourd’hui c’est votre jour, vous avez le droit à tout ! ».

Elle se caresse toujours la poitrine, tout en descendant d’une main entre ses cuisses sur sa robe, qu’elle remonte au passage sur ses hanches pour découvrir un très élégant string de dentelle noire, dont une large trace sombre trahit l’excitation déjà avancée de la jolie vulve se trouvant dessous... Sa main monte et descend sur ce sexe à travers le fin tissu. Elle appelle Stéphane à l’aide, pour lui demander de se rapprocher un peu, pour la débarrasser de ce string gênant, ce que Stéphane ne rechigne pas à exhausser. « Merci Stéphane, je me sens plus à l’aise ! » déclare-t-elle tout en faisant tomber de son pied droit son si sexy escarpin, pour de ce pied nu foncer, entre les jambes de Stéphane assis en face d’elle, plongeant immédiatement contre son membre tendu sous ce pantalon... Et quel membre...

« Mmmmmh Stéphane, mais vous êtes beaucoup trop serré dans votre pantalon, libérez-vous de suite ! » A la vue de l’engin de Stéphane sortant de son pantalon comme un diable de sa boîte, elle ne peut refréner un geignement de plaisir en se pinçant la lèvre supérieure... J’adore ce geste chez vous... La situation commençait à diaboliquement m’exciter aussi, et je ne me gênais pas alors pour sortir mon sexe à mon tour, et même à le caresser lentement tout en laissant le moment se dérouler. De son pied nu, elle caresse cette fois le sexe raide et gonflé, nu lui aussi, de Stéphane. Il bandait si fort... Elle gémis sous la divine sensation de son gland glissant sous ses orteils et sa voute plantaire. Le pauvre Stéphane lui haletait de plaisir et d’un désir puissant... Laissant tomber le second escarpins, c’est pieds nus qu’elle descend du bureau, pour venir se placer à quatre pattes face à Stéphane toujours assis dans sa chaise, ses fesses tendues vers moi, prenant soin de bien relever sa robe sur son dos pour m’offrir entièrement ses fesses et son sexe sublime, tout en venant caresser du bout du nez, puis de la pointe de la langue, le sexe de Stéphane de tout son long.

Je n’avais ni envie, ni de toute façon aucune raison de ne pas profiter de la situation, je suis le directeur après tout ! Sous les gémissements de Stéphane se faisant happer la hampe d’un seul geste par les lèvres sublimes de notre secrétaire dévouée, je venais à genoux, queue dressée hors du pantalon, ouvrir à pleines mains les fesses de cette dernière avant d’enfouir mon visage entre, pour laper d’un ample et long mouvement de tête son entrejambe savoureux, de sa vulve trempée à son petit trou brulant... Le gémissement de plaisir qu’elle pousse est totalement étouffé par la queue de Stéphane qu’elle dévore avec la plus indécente gourmandise, aussi bruyante que dégoulinante... Sublime... Pendant que je me régale du parfum intense de sa petite rondelle plissée à pleine langue, notre Stéphane lui halète à la limite de la syncope sous les coups de langue et succions langoureuses de notre secrétaire experte, qui n’en perd pas une miette. Relâchant enfin l’étreinte de sa bouche soyeuse sur le membre de Stéphane, relevant la tête, elle s’écrie : « Prenez moi Stéphane ! Venez, levez-vous, et prenez moi ! Ma chatte est à vous, vous le méritez, remplissez moi, prenez moi Stéphane, baisez moi ! ».

Excité à l’idée de ce qui allait se passer, je me relevais et me réinstallais à mon bureau pour laisser la secrétaire se placer debout, cambrée, cuisses écartées contre le bureau, s’appuyant le buste penché sur le bureau face à moi, offrant ainsi sa croupe à Stéphane, tout en m’offrant sa magnifique poitrine en suspension et les manifestations du plaisir sur son harmonieux visage... Stéphane, chauffé à blanc ne se fit pas prier, et se plaça de suite debout derrière elle, tout en frottant sa queue contre la chatte et le petit trou trempés de notre secrétaire, avant de l’enfiler, d’un seul geste du bassin, tout d’un coup au fond de sa chatte, lui faisant expulser du fond de la gorge un profond geignement de plaisir, trahissant les proportions généreuses de notre héros du jour... C’est fermement agrippé aux hanches de la secrétaire que notre employé plante son membre par à-coups successifs et espacés, pour autant permettre à notre secrétaire d’encaisser l’engin que de prendre pour les deux, tout le temps d’en savourer le bienfait infini...

Mais assez vite je sens Stéphane s’enhardir et commencer à accélérer dans le sexe de velours de notre secrétaire plus impliquée que jamais, gémissant langoureusement à chaque coup de reins en elle, jusqu’à ce que ce dernier se mette littéralement à ruer en elle, la pilonner bruyamment du claquement de son bassin contre le cul de rêve de notre collaboratrice... De mon coté, face au visage béat et aux râles de plaisir de cette si aguichante collègue, je ne peux résister à me caresser frénétiquement dans mon fauteuil en l’observant ainsi emplie de plaisir. De ma main libre j’effleure, caresse sa poitrine qui s’agite au rythme des coups de queue de notre collègue dans sa fente, en faisant rouler les tétons durcis d’excitation entre mes doigts.

Elle gémit c’est si excitant... Mais connaissant son implication insatiable, je comprends tout de suite en voyant ce regard se porter sur ma main enserrant et caressant ma queue fièrement gonflée et dressée face à elle, qu’il va falloir que j’apporte une pierre plus importante à l’édifice de plaisir en cours, si je veux préserver sa loyauté hors pair à l’entreprise... Je fais part alors de tout mon dévouement à mon tour pour monter à genoux sur mon propre bureau, afin de soumettre ma queue raide à la bouche soyeuse de la secrétaire... Assis sur mes talons, sur mon bureau, ma secrétaire cambrée, sa chatte assaillie par notre collaborateur, je me fais enfourner à pleine bouche par cette experte. Sa langue enlace ma hampe, mon gland, glisse, caresse, danse avec ma queue gorgée d’une folle excitation, transmettant par à-coups les coups de butoir de Stéphane qui s’époumone en râles profonds de plaisir tout en batifolant au fond de sa fente qui devait littéralement dégouliner le long de sa queue et gouter sur la moquette du bureau. Je gémissais aussi comme un diable, je dois bien l’avouer, sous les caresses non moins diaboliques de notre petite salariée au savoir-faire démoniaque.

Et c’est tout d’un coup, sans prévenir, que notre Stéphane craqua, en un long soupir de plaisir semblant exprimer un profond soulagement, tout en poussant son membre au plus profond du sexe de la secrétaire, expulsant à priori une quantité gargantuesque de sperme, au vue du bruit sourd des gouttes de liquide chaud s’écrasant quelques secondes plus tard sur la moquette... Notre Stéphane s’effondra en arrière sur sa chaise, la verge encore gonflée, essoufflé et béat. Notre coquine relâcha ma queue pour se retourner et constater avec un magnifique sourire son « petit » effet sur notre travailleur... Elle me jeta un regard coquin, et repris immédiatement en bouche mon gland tout en me masturbant savoureusement la hampe d’une main... « Merci beaucoup Madame la secrétaire, vous êtes vraiment une collaboratrice d’exception ! Je pense que Stéphane est ravi de votre reconnaissance. Mais terminez donc le travail, notre Stéphane est encore tout barbouillé. Aller, vite, et je vais vous récompenser aussi pour votre dévouement sans faille, vous le méritez aussi. »

La secrétaire se replace alors à genoux entre les jambes de Stéphane et s’emploie immédiatement au nettoyage de sa queue barbouillée de mouille et de sperme tout chaud. De mon coté, j’entreprends comme promis mes petites félicitations à notre dévouée, en frottant ma queue turgescente contre son petit trou si chaud, que le pilonnage en règle de son sexe semble avoir bien attendri... D’un filet de salive sur son petit trou, je place l’extrémité de mon gland sur sa rondelle torride. Et d’une lente poussée du bassin, mon gland écarte lentement son délicat anneau de feu, qui s’ouvre généreusement, jusqu’à se refermer sur ma hampe une fois le gland passé. Quel régal... On étouffe alors tous les deux un gémissement de plaisir profond, sous le regard hébété de Stéphane, dont la queue se ramollit sous la langue de notre complice. Son cul est un tel délice : chaud, humide, serré, glissant et brûlant...

Je gémis au rythme de mes allées et venues dans sa croupe, pendant qu’elle étouffe les siens de sa bouche pleine du membre maintenant tout propre de Stéphane. Mes mains caressent ses hanches, ma queue la prend, l’écarte, la remplit à son tour. Chauffé à blanc par toute cette affaire et par la pipe magistrale prodiguée quelques instants plus tôt, je suis à 2 doigts de jouir puissamment... Notre secrétaire le sais, et c’est une main entre ses cuisses, ses doigts tournoyants sur son clito, que de mes coups de reins dans son fondement elle jouit... Fort, expressivement, en relâchant la queue de Stéphane de sa bouche elle crie son pied, déclenchant chez moi l’orgasme le plus profond qu’il soit, que je crie à mon tour en retirant in extremis mon sexe de l’étreinte de ce petit trou d’enfer pour expulser en jets puissants, le fruit brûlant du désir et du plaisir donné par cette déesse, me répandant copieusement sur le creux de ses reins, ses fesses, son petit trou béant...

C’est béat de plaisir que nous nous essuyons alors, grâce à cette boite de mouchoirs que je laisse toujours sur mon bureau à bon escient, nous réajustons nos tenues, pour après une ferme poignée de main, remercier Stéphane pour son travail et lui demandons un rapport écrit complet sur la prochaine mission qu’il souhaite mener à bien. Quant à moi, j’invite la secrétaire à manger pour un petit repas sur le pouce... Des rendez-vous nous attendent cet après midi...

Bouvade (Tous droits réservés)


from Mua Bán Nhanh Xe Tải

Mua bán xe tải cũ 1 tấn

Để biết chọn cho mình chiếc xe tải cũ hạng nhẹ tốt nhất hãy tham khảo bài viết dưới đây của Mua Bán Nhanh Xe Tải nhé!

Có nên mua xe tải 1 tấn đã qua sử dụng ?

Hãy cùng Mua Bán Nhanh Xe Tải phân tích các ưu nhược điểm khi mua xe mới và mua xe cũ dưới đây.

1. Mua xe tải mới

Mua xe tải mới rất đơn giản bạn chỉ cần ghé thăm một đại lý uy tín nào đó và thông qua vài thủ tục cơ bản là có thể có phương tiện để sử dụng.

Ưu điểm chính của mua xe tải mới chính là bạn có thể mua được đúng loại xe, thương hiệu xe theo ý thích và hoàn toàn yên tâm về chất lượng hay các chính sách bảo hành của đơn vị cung cấp. Hiện nay, trên thị trường xe tải Việt cũng có rất nhiều các dòng xe tải Trung Quốc có chất lượng khá cao mà giá rẻ, giúp bạn có thêm nhiều lựa chọn. Một số ví dụ điển hình như xe tai Dongfeng, xe tải Faw....

Bên cạnh đó, khi mua xe mới, bạn sẽ không phải mất thêm bất kỳ khoản chi phí sửa chữa xe. Hơn nữa các dịch vụ giao dịch, liên hệ ngân hàng sẽ được người bán làm giúp bạn.

Và một ưu điểm nữa chính là mua xe mới khiến người mua cảm giác an toàn hơn.

Tuy nhiên, hạn chế của quyết định này chính là chi phí mua xe khá cao, xe nhanh mất giá và các chi phí cơ hội khác.

2. Mua xe tải cũ

Xe tải cũ hiện cũng đang được khá nhiều khách hàng tìm kiếm để mua. Bởi ngân sách để mua xe rẻ hơn rất nhiều so với xe mới và người mua có thể thương lượng giá cả với người bán dễ dàng hơn. Đây là một điểm cộng chính giúp cho thị trương xe tải cũ lên ngôi. Mặt khác, mua xe cũ không có nghĩa là bạn không thể sở hữu những mẫu xe đời mới mà thậm chí nó còn vận hành rất tốt và giá rẻ hơn nhiều.

Bên cạnh đó, hạn chế rất lớn của xe tải cũ chính là việc bạn có thể mua phải chiếc xe không ưng ý và mất nhiều chi phí phải sửa chữa. Nếu người mua không kiểm tra kỹ chiếc xe, có thể dẫn tới tiền mất tật mang, sống chung với lũ. Đặc biệt, nếu chiếc xe đó không còn bảo hành thì tính riêng việc sửa xe cũng khiến bạn đau đầu. Hơn nữa, theo quy định của Bộ giao thông vận tải, thì việc chuyển nhượng, sang tên cũng khá lằng nhằng.

Mua xe tải cũ và những sai lầm thường gặp

1. Bỏ qua bước tìm hiểu, thu thập thông tin

Dù là mua xe đã qua sử dụng hay xe mới thì việc tìm hiểu, thu thập thông tin luôn là một bước quan trọng mà người mua không nên bỏ qua. Điều này còn trở nên quan trọng hơn khi bạn mua một chiếc xe sang đã qua sử dụng. Lý do là bởi sau mỗi quãng thời gian, xe sang và cả động cơ sẽ có định nghĩa về giá trị khác nhau.

Sự am hiểu sẽ giúp bạn tránh được sai lầm khi mua xe tải cũ. Hãy chắc chắn rằng bạn đã tìm hiểu kỹ lưỡng về chiếc xe mà mình chọn có xứng đáng với số tiền bỏ ra không?

2. Mua vì thương hiệu

Sự hào nhoáng của thương hiệu xe tải đôi khi sẽ khiến bạn mắc sai lầm, vì thế đừng quá quan tâm đến danh tiếng thương hiệu của chiếc xe đó. Mặc dù là xe cũ, nhưng nó có thể hư hỏng và gặp bất cứ sự cố nào bởi đó là những chiếc xe tải cũ.Thay vì tin tưởng vào thương hiệu xe bạn hãy tin tưởng vào kiến thức và kinh nghiệm xe của mình. Hãy nhớ rằng, điều bạn cần ở một chiếc xe không chỉ là mỗi thương hiệu.

3. Mua xe tải cũ quá vội vàng

Không bao giờ được vội vã trong việc lựa chọn mua xe hơi cũ, vì bản chất xe cũng chỉ hàng hoá. Do đó, nếu hết chiếc này thì các bạn có thể tìm được một chiếc khác hoặc nhà sản xuất sẽ cho loại đó xuất xưởng thêm. Vì thế, đừng vội đưa ra quyết định mua và dành thêm thời gian để suy nghĩ cẩn trọng hơn.

4. Không lái thử

Một số người mua thường mắc sai lầm khi mua xe tải cũ theo phương thức trực tuyến mà không lái thử. Họ lầm tưởng rằng mình đã mua được một chiếc xe tải cũ có giá rẻ vì thế mà dễ dàng đồng ý không cần lái thử trước khi mua xe. Nhưng cuối cùng thay vì một chiếc xe cũ, đó chỉ là một mớ hỗn độn tiêu tốn của bạn thời gian và tiền bạc để sửa chữa, bảo dưỡng, mà phí bảo dưỡng của một chiếc xe sang thì không hề rẻ chút nào. Dù đó là lý do gì, hãy luôn lái thử xe tải trước khi quyết định mua.

Để chiếc xe tải cũ của bạn khi mua về bền ngoài việc kiểm tra , tìm hiểu kĩ thì thói quen sử dụng của bạn cũng ảnh hưởng đến độ bền của chiếc xe cũ. Phần tiếp theo Mua Ban Nhanh Xe Tải xin chia sẻ những sai lầm bạn thường gặp khi sử dụng xe tải khiến xe nhanh hỏng.

4 sai lầm khiến chiếc xe tải cũ của bạn nhanh bị hư hỏng

1. Đổ nhầm nhiên liệu

Mỗi dòng xe được quy định về một loại nhiên liệu nhất định. Nếu bạn không chú ý, bạn đổ nhầm nhiên liệu sẽ khiến xe rất dễ bị chết máy. Và điều này thực sự là rất nguy hiểm khi xe bạn đang vận hành với vận tốc cao. Tốt nhất bạn nên dán decal về loại nhiên liệu mà xe mình sử dụng lên nắp bình để tránh sự nhầm lẫn không đáng có này.

2. Thay nhớt máy khi đã cạn

Rất nhiều người sử dụng xe thường không để ý tới các khuyến cáo thay dầu nhớt định kỳ, họ cứ cho xe vận hành cho tới khi xe báo hết dầu máy mới thay. Điều này khiến các động cơ bị thiếu dầu nghiêm trọng, có những trường hợp còn dẫn tới bó kẹt máy, làm hư hại cá chi tiết máy và làm giảm tuổi thọ của động cơ. Bạn nên xem một số lưu ý lựa chọn dầu nhớt cho xe tải.

3. Ưu tiên thay lốp mới cho bánh trước

Trong suy nghĩ của nhiều người, bánh trước là bộ phận phải chịu áp lực nhiều và mau mòn hơn, do đó họ thường ưu tiên thay lốp mới cho bánh trước.

Tuy nhiên, quan điểm này là không đúng. Bởi nếu bạn chỉ thay lốp mới cho bánh trước, xe của bạn có thể bị trượt nhanh hơn khi đi qua một vũng nước, ổ gà và gây mất an toàn. Tốt nhất là nên thay cặp lốp mới cho 2 bánh xe phía sau. Nếu cặp bánh sau mòn ít, bạn có thể chuyển nó ra trước.

Lốp xe dự phòng và các vấn đề càng lưu ý

Quên thay các loại dung dịch khi cần thiết; Khoogn chỉ là dầu nhớt mới cần được chú ý thay thế định kỳ, bạn nên kiểm tra các loại dung dịch khác để đảm bảo chiếc xe luôn vận hành ổn định nhất; Nên thường xuyên kiểm tra các bộ phận trên xe nhằm phát hiện các sai hỏng để có các kế hoạch điều chỉnh kịp thời. Bạn có thể biết thêm nhiều thông tin hữu ích khác khi muốn mua bán xe tải cũ qua các bài viết mua bán xe tải cũ.


from techxonic

Best quality Stamp maker in Dubai and Abu Dhabi, UAE.

Zahrat Al Madina Printing offers high quality company stamps making in Dubai and Abu Dhabi. Zahrat Al Madina printing has all types of Stamp makers Dubai such as round company stamps, rectangular company stamps, square company stamps. They are reliable Stamp makers Dubai offering stamp making services at very low cost for the business in Dubai and Abu Dhabi.

Stamp Printing Dubai, Stamp maker, Stamp makers Dubai, Stamps makers, Company stamps Dubai, Company stamps, Stamps in Dubai, Rubber stamps makers, Rubber stamps Dubai, Company stamps makers


from techxonic

Banners Printing company in Dubai and Abu Dhabi, UAE.

Banner printing solutions are employed by companies for years. This sort of print solution enables you to make a singular banner to market your company that you simply can use for all kinds of events to make sure you attract your audience and boost your brand.

One of the benefits of Banners printing Dubai is the versatility of those marketing items. You’ll use them anywhere. Place them outside your store to grab attention of passing traffic or hang them above or across your stand when participating during a fair. If you sponsor any events, you'll hang them with ease in order that you're always improving your brand visibility and ensuring you exceed your target pool when it involves increasing your customer base.

Another great advantage of using banners as a part of any marketing campaign is that if you complete your design well and you specialize in making an impression, your banners are going to be memorable. Anyone interested will remember something that catches their eye a few large banners ahead of them and that they will remember your company when it involves purchasing products or services that you simply provide.

The aim of any Banners printing Dubai is to catch attention and make an impression. Your design should be focused on getting a message across in a catchy way that creates sure your clients see and note what you've got to mention. Planning is imperative to be sure that you simply make the impact you would like to make and your clients do note move forward. A neat banner can provide you with an honest return on your marketing investment.

You will find that Banners printing Dubai is affordable and you'll easily be ready to incorporate it into your budget. A reasonable marketing tool that you simply can use anywhere and is bound to reach a number of your audience.

In addition to the advantages, there are some important factors that require consideration when it involves banner printing to make sure that it provides you with the results you're looking to realize. The primary thing is you would like to make sure you buy the best quality Material such as PVC Banners or Vinyl Banners. The banner you select should be robust and sturdy.

If you're attending an outdoor event and it starts raining or the wind starts blowing, you would like to understand the banner won't be damaged. Further hanging it and taking it down at various events shouldn't cause unnecessary wear that you simply have to replace the banner within a brief period of your time.

You will also make sure that the banner printing you select gives you a water-proof product that will not get damaged when it rains and is straightforward to wash. You ought to be ready to wipe the banner to dry without fear that you simply will smudge the printing. Additionally, to the present, the item should be fade resistant. When participating in outdoor events, you do not want your banner fading so it doesn't make the impact you would like anymore and you would like to exchange it before expected.

Ensure you buy from a reputable printing specialist company with an honest reputation for his or her banner printing services. The corporation should provide you with a design and print service, combined with top quality products that you simply can trust. Additionally, to the present, the attempt to choose a corporation which will provide you with an honest return policy, within the event the item arrives damaged or isn't as described.

Zahrat Al Madina Printing Services is a design and print Specialist Company offering great quality PVC Banners printing Dubai and Vinyl banners printing Dubai for all our customers in Dubai. The corporation provides clients with the very best quality products providing their service to customers throughout the planet on a day to day basis. The corporation offers an entire service from design to print and delivery or clients can choose which part of the service they have supported their requirements and budget. Zahrat Al madina offers a satisfaction guarantee to make sure that they exceed their client’s expectations in the least amount of time. To seek out more contact banner printing dubai.

Banners printing Dubai


from techxonic

Stickers Printing Company in Dubai and Abu Dhabi, UAE.

Zahrat Al Madina printing offers all types of Sticker printing dubai such as Window stickers printing, Transparent stickers printing, Glass stickers printing, Floor stickers printing for your businesses in Dubai and Abu Dhabi. Moreover, Zahrat Al Madina printing also offers Sticker printing dubai, Indoor stickers printing, Paper stickers printing, Sticker printing dubai, Die cutting stickers printing, PVC round stickers printing, Vinyl stickers Printing and full Vehicle stickers printing and branding at very competitive pricing. For more detail please feel free to contact Zahrat Al Madina Printing Services.

sticker printing stickers printing, Sticker printing dubai, Stickers printing dubai, Glass Stickers printing dubai, Floor Stickers printing dubai, Outdoor Stickers printing dubai, Paper Stickers printing dubai