Fake Amazon themed email.

Et si l’Institut Pasteur décidait de lâcher Ebola dans la nature ?

Bonjour à tous,

Le titre est accrocheur mais c’est ce qu’il s’est passé avec WannaCrypt…

Microsoft nous prévient régulièrement et cela depuis des années qu’il a axé sa stratégie sur la sécurité des postes de travail. Ce qu’il s’est passé voici 10 jours est le résultat d’une négligence avérée dans la maintenance des parcs informatiques.

Je ne vais pas réécrire l’actualité du moment, je vous laisse lire ce très bon article de ZDNet dans son intégralité.

Bonne journée.
Patrice.

Cet article chez ZDNet… http://www.zdnet.fr/blogs/green-si/heureux-comme-un-wanacrypt-dans-un-jeu-d-applications-obsoletes-39852428.htm

L’objet de ce billet est d’aider les managers et les équipes métiers en charge des applications à prendre conscience que l’obsolescence technique se gère autant que les nouveaux projets.

Ce lundi 15 mai, de nombreuses DSI vont se réveiller avec la gueule de bois après le passage ce weekend d’une tornade non prévue: WanaCrypt.

Certains furent déjà sur le pont tout le weekend pour prévenir leurs utilisateurs. La mauvaise nouvelle c’est que cette tornade pourrait encore durer quelques temps vu la boîte de Pandore qu’elle vient d’ouvrir. C’est l’objet de ce billet que d’aider les managers et les équipes métiers en charge des applications à en prendre conscience. WanaCrypt est un "rançonware", c’est à dire un logiciel qui une fois installé sur un poste de travail (via la pièce jointe d’un email reçue et ouverte ou la propagation sur le réseau local de l’entreprise en mode "worm") en crypte tous les fichiers puis demande entre $300 et $600 en bitcoin pour récupérer ses données. Le bitcoin permet aux hackeurs de garder l’anonymat pour réutiliser la somme. Même si l’argent est généralement la principale motivation des hackeurs, dans le cas présent rien ne garantit que les données soient restituées. Les consignes sont d’ailleurs généralement de ne pas payer pour ne pas encourager de prochaines opérations. Traduisez, votre poste crypté vient d’être sacrifié… Vendredi 12 mai c’est le Royaume Uni qui a fait les frais d’une vague massive d’emails de phishing et d’une propagation fulgurante au sein de ses entreprises. Elle a notamment touché une entreprise publique très médiatisée, National Health Service, le gestionnaire des hôpitaux anglais, des hôpitaux qui ont été rapidement désorganisés quand les employés ne pouvaient plus utiliser leur ordinateur pour récupérer les données des patients. Des entreprises de toute l’Europe ont également été touchées, comme Renault qui a immédiatement stoppé la production sur son site de Sandouville, Nissan UK, la Deutsche Bank, la Banque de Bilbao ou Telefonica l’opérateur historique espagnol.

Depuis on parle de cyber-attaque massive et mondiale, et fait rare, le journal de 20h de la Une a ouvert pendant 5 minutes sur ce titre samedi soir, la veille d’une actualité politique pourtant chargée en France avec la prise de fonction du nouveau Président de la République française. C’est vrai que l’envoi de 5 millions d’emails par heure (comme cité par certains rapports de sécurité) peut être considérée comme une attaque massive (en 2016 les 215 milliards d’emails envoyés dans le monde – hors spam – correspondent à 24 millions d’emails par heure en moyenne).

Cependant GreenSI trouve que c’est un peu simpliste de ne regarder que le côté "cyber-attaque" même si visiblement cette attaque paraît organisée (préparer des millions d’emails à l’avance) et pensée (lancement un vendredi avant le weekend en ciblant les entreprises ?).

Dans cette crise le vrai problème pour les SI est surtout du côté de la défense! En effet, plusieurs "faits" découlant de politiques passées ont affaibli les défenses des entreprises,ce qui a favorisé la vitesse de propagation du virus en leur sein. Ces faits doivent nous faire réfléchir sur la gouvernance des SI au moment où ils deviennent de plus en plus critiques pour toutes les activités.

Une faille connue Cette faille de sécurité dans Windows était connue et bien identifiée, notamment par la NSA qui l’exploitait comme porte dérobée pour espionner les PCs. Elle a fait l’objet du bulletin de sécurité de Microsoft du 14 mars (MS17-010), donc il y a déjà un mois, avec la liste des systèmes concernés et le correctif à appliquer.

http://www.zdnet.fr/i/edit/2017/05/39852428/ms%20critique.jpg

Et pourtant tous les systèmes n’ont pas été mis à jour en un mois alors que la mise à jour était critique

Des SI qui utilisent des produits non maintenus La faille est aussi présente sur Windows XP et Server 2003 qui représentent encore un bon pourcentage respectivement des postes de travail et serveurs, et notamment ceux du NHS, alors que ces produits ne sont plus maintenus par l’éditeur. Heureusement, dans l’urgence, Microsoft a diffusé gratuitement un correctif ce weekend.

Les grands comptes qui ont payé très chère la "software assurance" de Microsoft pour XP, pour avoir de façon privilégiée quelques correctifs, doivent l’avoir mauvaise puisque le correctif du weekend a été livré gratuitement a tout le monde 😉 Quoi qu’il en soit, l’obsolescence est une réalité dont le management devrait se préoccuper, une partie du SI tourne sur des produits non maintenus donc vulnérables et ce souvent des applications anciennes au cœur des processus et de l’organisation. Est-ce que les métiers en charge des applications en sont conscients ?

Des postes de travail pas toujours sauvegardés Avoir un backup de l’ensemble des postes de travail de son entreprise semble une évidence, mais est en fait très compliqué à mettre en œuvre opérationnellement (avec la mobilité et les portables par exemple). La réalité est que si un poste est verrouillé et crypté, le retour arrière se fera en perdant certainement des données du poste.

Il faut donc accepter cette réalité, tout poste de travail doit pouvoir être détruit sans prévenir et sans impacter l’entreprise (au-delà des heures perdues par son malchanceux utilisateur… ) et surtout se préparer à l’affronter. Ceux qui ont engagé des politiques d’outils collaboratifs auront plus de chance avec les données des projets stockées dans ces outils au lieu d’être sur les postes des utilisateurs. Mais j’ai malheureusement vu trop de projets repasser d’outils collaboratifs à des outils personnels sous Excel, au gré des consultants de passage, pour encore y croire…

Une NSA qui joue à l’apprenti sorcier La faille a été identifiée par la NSA il y a longtemps et les outils pour l’exploiter, qui ont certainement mobilisé les meilleurs experts en sécurité du moment, ont malencontreusement été dérobés à la NSA par un collectif de hackers en mars dernier (Shadow Brokers). Un peu comme si l’Institut Pasteur laissez filer plusieurs souches du virus de la variole, aujourd’hui disparu, et qu’il conserve à des fins scientifiques. On peut accuser tous les hackeurs du monde, la responsabilité de la NSA ne doit pas être oubliée et elle est double: avoir fabriqué les matériaux du virus ET les avoirs perdus dans la nature. Il n’y a malheureusement pas de comité d’éthique pour ce qui concerne l’informatique. Avec l’arrivée de l’intelligence artificielle, peut-on tout laisser faire parce que c’est du logiciel et non de la manipulation d’embryons humains ? Et finalement, cela ne montre-t-il pas que les gouvernements peuvent aussi être plus dangereux que les hackers ? Les systèmes d’information des entreprises reliés dans un SI global par Internet étaient donc bien malades avant d’aborder cette nouvelle attaque virale !

Là où les défenses étaient faibles, là où les investissements pour le maintenir n’étaient plus en phase avec la criticité métier, c’est là que le SI est tombé rapidement.

Dans un hôpital, dans une chaîne de production, dans une chaîne logistique, certainement tous des systèmes anciens qui ont toujours donné satisfaction, qui évoluent peu ou plus, et qui sont passés sous la ligne de visibilité des investissements d’obsolescence technique.

La Première Ministre Théresa May, est intervenue rapidement pour rassurer sur le fait que le Royaume Uni n’était pas la seule cible de l’attaque mais a surtout déploré le fait que l’ampleur au Royaume Uni avait été exacerbée par une "politique conservative du NHS découlant des mesures d’austérité du gouvernement".

GreenSI vous rappelle le graphe de décision de la maintenance: si la probabilité est forte et que le coût de mise à jour est élevé alors il n’y a qu’une alternative, patcher !

A l’ère du digital et de la transformation numérique le rôle de la DSI reste prioritairement de gérer cette obsolescence, car la durée de vie des applications est entre 7 et 10 ans, donc bien après la fin des projets de développement. Pour cela elle a besoin des métiers et du management, elle doit mettre en place une gestion des compétences pour conserver celles dont on peut avoir besoin sur des systèmes obsolètes. Mais pour ne pas faire crouler les investissements sous le poids de sa dette (technique) la meilleure stratégie reste encore de supprimer les applications qui apportent une valeur marginale mais sont surtout un handicap ou un danger pour la globalité du SI. Plus on a d’applications, plus on a un SI hétérogène technologiquement, et plus on est exposé à l’ensemble des failles qui ne manqueront pas de survenir dans un des composants techniques. WanaCrypt aura au moins eu le mérite de nous le rappeler et GreenSI pense pour longtemps.

Alors maintenant qu’est-ce qu’on fait: I want to crypt (wanacrypt) or I want to upgrade ?

A bientôt.
Patrice.

Removing Orphaned Populated msExchangeDelegateLinkList and msExchangeDelegateLinkListBL Automapping Attributes

By Ace Fekay
Published 5/11/2017

Scope

How to remove a shared mailbox that keeps showing up in your Outlook profile that you’ve been removed as a delegate.

Automapping

Automapping is an Autodiscover feature that was added to Exchange 2010 SP1 and newer, that allows Outlook to automatically add a delegated mailbox without additional tasks.

Autodiscover looks at the mailbox owner’s AD account for an attribute called the MSExchDelegateListLink attribute.

When you use the EAC or PowerShell to delegate permissions to a shared mailbox or to another user, Exchange will automatically set the Automapping feature to $True. In PowerShell you can disable this, but not in the EAC.

This feature populates the MSExchDelegateListLink attribute on the shared or delegated mailbox with the user accounts that will be Automapped, and vice-versa, it also populates the MSExchDelegateLinkListBL attribute on the user account. I look at this as the “back link” to the shared mailbox.

These two attributes are one of  nine (9) links and backlinks that exist. Here’s a list of all links and backlinks in AD and more specifics can be found at the following link:
http://www.neroblanco.co.uk/2015/07/links-and-backlinks-in-active-directory-for-exchange/

Outlook, Autodiscover, and those attributes

When Outlook fires up, and while running, part of what Autodiscover process performs is it will check these two attributes to determine if there are any shared mailboxes that must be automatically added to the Outlook profile. In some cases using a managed process for shared mailboxes, we may want this feature disabled so the shared mailbox does not get automatically added.

Orphaned backlink is still populated and the mailbox still shows up in Outlook

If the user was previously delegated to a shared mailbox, then the delegated per,missions were removed, but for some reason, perhaps replication or corruption, or some other unforeseen factor (large environments fall under this category), the shared mailbox still shows up and you can’t get rid of it, and further, since you no longer have permissions, you can’t open it. This will cause the shared or delegated mailbox to still show up in Outlook. But you can clearly see in EAC or running a get-mailboxpermission that the user is no longer delegated.

Example of an account with the msExchDelegateLinkListBL still populated:

image

 

How to remove it?

First, establish your PowerShell session to Exchange onprem or your Office 365 tenant. If unsure how, see this:
http://blogs.msmvps.com/acefekay/2017/05/11/establishing-a-powershell-session-to-your-office-365-tenant-or-onprem-exchange/

Determine, if any, links or backlinks exist on the shared mailbox:

Get-ADUser “SharedMailboxDisplayName” -Properties msExchDelegateListLink | Select-object -ExpandProperty msExchDelegateListLink

If any show up, you’ll see their sAMAccountNames. If you don’t know who the sAMAccountNames are and you want to see their displayNames, run the following (this command works for DNs, too):

For one account:
get-aduser sAMAccountName -Properties displayName,mail  | ft Name, DisplayName, mail -A

For a list of accounts in a text file:
get-content c:tempnames.txt | get-aduser -Properties displayName,mail  | ft Name, DisplayName, mail –A

 

Then remove the msexchDelegateLinkListBL orphaned backlink:

Note: I’m using the shared mailbox’s displayName. This will also work using the sAMAaccountName or the primary email address.

For one account:
Remove-MailboxPermission “SharedMailboxDisplayName” -user $_ –AccessRights FullAccess -Confirm:$false

For a list of accounts in a text file:
get-content c:tempaceuserIDsusers.txt | foreach {Remove-MailboxPermission “SharedMailboxDisplayName”  -user $_ –AccessRights FullAccess -Confirm:$false}

Then if needed, delegate the shared mailbox again & disabling Automapping

Delegate Ace to a shared mailbox:
Add-MailboxPermission “Shared Mailbox Name or email address” -User AceFekay@contoso.com -AccessRights FullAccess -AutoMapping:$false

 

============================================================

Summary

I hope this helps!

Published 5/18/2017

Ace Fekay
MVP, MCT, MCSE 2012, MCITP EA & MCTS Windows 2008/R2, Exchange 2013, 2010 EA & 2007, MCSE & MCSA 2003/2000, MCSA Messaging 2003
Microsoft Certified Trainer
Microsoft MVP – Directory Services

As many know, I work with Active Directory, Exchange server, and Office 365 engineer/architect, and an MVP in Active Directory and Identity Management, and I’m an MCT as well. I try to strive to perform my job with the best of my ability and efficiency, even when presented with a challenge, and then help others with my findings in case a similar issue arises to help ease their jobs. Share the knowledge, is what I’ve always learned.

I’ve found there are many qualified and very informative websites that provide how-to blogs, and I’m glad they exists and give due credit to the pros that put them together. In some cases when I must research an issue, I just needed something or specific that I couldn’t find or had to piece together from more than one site, such as a simple one-liner or a simple multiline script to perform day to day stuff.

I hope you’ve found this blog post helpful, along with my future scripts blog posts, especially with AD, Exchange, and Office 365.

clip_image0023 clip_image0043 clip_image0063 clip_image0083 clip_image0103 clip_image0123 clip_image0143 clip_image0163

Complete List of Technical Blogs: http://www.delawarecountycomputerconsulting.com/technicalblogs.php

Or just search within my blogs:
https://blogs.msmvps.com/acefekay/

This posting is provided AS-IS with no warranties or guarantees and confers no rights.


 

Diskpart and PowerShell – part4: Remove a partition

So far you’ve seen how to create and modify partitions and volumes. Its now time to look at how you remove a partition.

Mount the test VHD

Get-VHD -Path C:testTest1.vhdx | Mount-VHD

 

You can’t remove a volume – you have to remove the partition. Identifying the CORRECT partition to remove is the challenge

PS> Get-Partition | select PartitionNumber, DriveLetter, Size, Type

PartitionNumber DriveLetter         Size Type 
--------------- -----------         ---- ---- 
              1                134217728 Reserved 
              2           F   8589934592 Basic 
              1                367001600 IFS 
              2           C 511269232640 IFS 
              3                470810624 Unknown

 

Not every partition has a drive letter and partition numbers are repeated. The partition object holds the disk number

PS> Get-Partition | select DiskNumber, PartitionNumber, DriveLetter, Size, Type | Format-Table

DiskNumber PartitionNumber DriveLetter         Size Type 
---------- --------------- -----------         ---- ---- 
         1               1                134217728 Reserved 
         1               2           F   8589934592 Basic 
         0               1                367001600 IFS 
         0               2           C 511269232640 IFS 
         0               3                470810624 Unknown

 

So the combination of disk number and partition number is unique and will identify any partition. Remove our 8GB partition

Remove-Partition -DiskNumber 1 -PartitionNumber 2 -Confirm:$false

and the 128MB partition

Remove-Partition -DiskNumber 1 -PartitionNumber 1 -Confirm:$false

 

Get-Partition will show that the drive F: has been removed

Looking the disk organisation

Get-Disk -Number 1 | Select @{N='Size'; E={[math]::Round(($_.Size / 1GB), 2)}}, @{N='AllocatedSize'; E={[math]::Round(($_.AllocatedSize / 1GB), 2)}}, @{N='LargestFreeExtent'; E={[math]::Round(($_.LargestFreeExtent / 1GB), 2)}} | Format-List

Size              : 20 
AllocatedSize     : 0 
LargestFreeExtent : 20

 

The whole of the disk is now available for re-use

Subtle Bug with std::min/max Function Templates

Suppose you have a function f that returns a double, and you want to store in a variable the value of this function, if this a positive number, or zero if the return value is negative. This line of C++ code tries to do that:

double x = std::max(0, f(/* something */));

Unfortunately, this apparently innocent code won’t compile!

The error message produced by VS2015’s MSVC compiler is not very clear, as often with C++ code involving templates.

So, what’s the problem with that code?

The problem is that the std::max function template is declared something like this:

template <typename T> 
const T& max(const T& a, const T& b)

If you look at the initial code invoking std::max, the first argument is of type int; the second argument is of type double (i.e. the return type of f).

Now, if you look at the declaration of std::max, you’ll see that both parameters are expected to be of the same type T. So, the C++ compiler complains as it’s unable to deduce the type of T in the code calling std::max: should T be int or double?

This ambiguity triggers a compile-time error.

To fix this error, you can use the double literal 0.0 instead of 0.

And, what if instead of 0 there’s a variable of type int?

Well, in this case you can either static_cast that variable to double:

double x = std::max(static_cast<double>(n), f(/* something */));

or, as an alternative, you can explicitly specify the double template type for std::max:

double x = std::max<double>(n, f(/* something */));

Removal instructions for DriverDr

What is DriverDr?

The Malwarebytes research team has determined that DriverDr is a “system optimizer”. These so-called “system optimizers” use intentional false positives to convince users that their systems have problems. Then they try to sell you their software, claiming it will remove these problems.

https://forums.malwarebytes.com/topic/201462-removal-instructions-for-driverdr/

Diskpart and PowerShell–part 4: Expand a volume

Let’s create a new disk and mount it

New-VHD -Path C:testTest1.vhdx -Dynamic -SizeBytes 20GB 
Get-VHD -Path C:testTest1.vhdx | Mount-VHD 
Initialize-Disk -Number 1

 

This time we’ll create a volume that only uses part of the disk

New-Partition -DiskNumber 1 -DriveLetter F -Size 5GB

 

And now format the partition

Get-Partition -DriveLetter F | 
Format-Volume -FileSystem NTFS -Confirm:$false –Force

 

The disk is organised like this

Get-Disk -Number 1 | 
Select @{N='Size'; E={[math]::Round(($_.Size / 1GB), 2)}}, 
@{N='AllocatedSize'; E={[math]::Round(($_.AllocatedSize / 1GB), 2)}}, 
@{N='LargestFreeExtent'; E={[math]::Round(($_.LargestFreeExtent / 1GB), 2)}} | 
Format-List

 

Size              : 20 
AllocatedSize     : 5.13 
LargestFreeExtent : 14.87

 

Lets expand the partition

Get-Partition -DriveLetter F | 
Resize-Partition -Size 8GB

 

And re-examine the disk organisation

Get-Disk -Number 1 | 
Select @{N='Size'; E={[math]::Round(($_.Size / 1GB), 2)}}, 
@{N='AllocatedSize'; E={[math]::Round(($_.AllocatedSize / 1GB), 2)}}, 
@{N='LargestFreeExtent'; E={[math]::Round(($_.LargestFreeExtent / 1GB), 2)}} | 
Format-List

Size              : 20 
AllocatedSize     : 8.13 
LargestFreeExtent : 11.87

 

The extra space is added to the volume and formatted to match the existing filesystem on the volume

Microsoft Security Update Releases Issued: May 19, 2017

Summary

The following CVE has undergone a major revision increment.

* CVE-2017-0223

Revision Information:

CVE-2017-0223

– Title: CVE-2017-0223 | Microsoft Edge Elevation of Privilege
Vulnerability
https://portal.msrc.microsoft.com/en-us/security-guidance
– Reason for Revision: This CVE was addressed by KB4016871, but was
inadvertently omitted from the May 2017 Security Updates. This is
an informational change only.
– Originally posted: May 19, 2017
– Updated: May 19, 2017
– CVE Severity Rating: Important
– Version: 1.0

Firefox 53.0.3 Released May 19, 2017

Version 53.0.3, first offered to Release channel users on May 19, 2017

Fixed

  • FIx hangs when using a proxy with NTLM authentication (bug 1360574)
  • Fix excessive resource usage from the captive portal detection service (bug 1359697)

Changed

  • Bump preloaded security information expiration times (bug 1364240)

https://www.mozilla.org/en-US/firefox/53.0.3/releasenotes/

Removal instructions for Gifables

What is Gifables?

The Malwarebytes research team has determined that Gifables is a browser NewTab. These so-called “NewTabs” can manipulate your browser(s), for example to change your startpage or searchscopes, so that the affected browser visits their site or one of their choice.

https://forums.malwarebytes.com/topic/201182-removal-instructions-for-gifables/

Table or List

A question on the forum asked why a object is displayed in a table if it has 4 or fewer properties and as  a list if it  has more than 4 properties:

PS> [PSCustomObject]@{P1=1; P2=2; P3=3; P4=4}

P1 P2 P3 P4 
-- -- -- -- 
1  2  3  4


PS> [PSCustomObject]@{P1=1; P2=2; P3=3; P4=4; P5=5}


P1 : 1 
P2 : 2 
P3 : 3 
P4 : 4 
P5 : 5

 

This is a built in mechanism in PowerShell and is done automatically.

 

The quick way to get the output in table format is to use Format-Table

PS> [PSCustomObject]@{P1=1; P2=2; P3=3; P4=4; P5=5} | Format-Table

P1 P2 P3 P4 P5 
-- -- -- -- -- 
1  2  3  4  5

Surface Dial Revisited

Some time ago, I’ve written a post about Surface Dial programming. With the introduction of the Creator’s Update, some things have improved. In this post, I will show some changes and will revisit the program that was developed and add these to the app. To use these changes, you need to have the Windows 10 Creator’s Update installed (you will have it if you are using the Windows Insider builds), Visual Studio 2017 and the Creator’s Update SDK (build 15063) installed. Once you have these pre requisites installed, go to the project properties in Visual Studio and change the target version to 15063:

image

With that, the new APIs will be opened.

Menu icons from font glyphs

A welcome change was the possibility to use font glyphs for the menu items. In the previous version, we had to add PNG files to the project, create the icon and then create the menu item, with some code like this:

var iconResize = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/Resize.png"));
var itemResize = RadialControllerMenuItem.CreateFromIcon("Resize", iconResize);
            

This is not needed anymore: now, we can use the CreateFromFontGlyph method, that creates the menu item from a font glyph, that can come both from an installed font or for a custom font for the app. This code creates the menu icons for the app:

// Create the items for the menu
var itemResize = RadialControllerMenuItem.CreateFromFontGlyph("Resize", "xE8B9", "Segoe MDL2 Assets");
var itemRotate = RadialControllerMenuItem.CreateFromFontGlyph("Rotate", "xE7AD", "Segoe MDL2 Assets");
var itemMoveX = RadialControllerMenuItem.CreateFromFontGlyph("MoveX", "xE8AB", "Segoe MDL2 Assets");
var itemMoveY = RadialControllerMenuItem.CreateFromFontGlyph("MoveY", "xE8CB", "Segoe MDL2 Assets");
var itemColor = RadialControllerMenuItem.CreateFromFontGlyph("Color", "xE7E6", "Segoe MDL2 Assets"); 

We only have to add the Unicode character and the font name and that’s all. The new Surface Dial menu is like this:

image

Once we have the new menu, we can add new features to the app.

Changing behavior when the button is pressed

One change that we can make to the project is to detect when the button is pressed and change the behavior when the dial is rotated. This is done by using the new IsButtonPressed property in the RadialControllerRotationChangedEventArgs class. We can use it in the RotationChanged event to move diagonally when the button is pressed. We only need to do a small change to the code:

private void ControllerRotationChanged(RadialController sender, 
    RadialControllerRotationChangedEventArgs args)
{
    switch (_currentTool)
    {
        case CurrentTool.Resize:
            Scale.ScaleX += args.RotationDeltaInDegrees / 10;
            Scale.ScaleY += args.RotationDeltaInDegrees / 10;
            break;
        case CurrentTool.Rotate:
            Rotate.Angle += args.RotationDeltaInDegrees;
            break;
        case CurrentTool.MoveX:
            Translate.X += args.RotationDeltaInDegrees;
            if (args.IsButtonPressed)
                Translate.Y += args.RotationDeltaInDegrees;
            break;
        case CurrentTool.MoveY:
            Translate.Y += args.RotationDeltaInDegrees;
            if (args.IsButtonPressed)
                Translate.X += args.RotationDeltaInDegrees;
            break;
        case CurrentTool.Color:
            _selBrush += (int)(args.RotationDeltaInDegrees / 10);
            if (_selBrush >= _namedBrushes.Count)
                _selBrush = 0;
            if (_selBrush < 0)
                _selBrush = _namedBrushes.Count-1;
            Rectangle.Fill = _namedBrushes[(int)_selBrush];
            break;
        default:
            break;
    }
}

 

When the tool is MoveX or MoveY, we check for IsButtonPressed and, if it’s on, we move both in the X and Y directions at the same time. Now, if you run the code and press the button while rotating the dial, you will see that the rectangle moves in the diagonal.

Hiding the menu

The menu is a great tool, but some times, it’s too intrusive and you would like to hide it. Until now, there was no way to hide it, but the Creator’s Update introduced the possibility to do that. You just have to set the IsMenuSuppressed property of the RadialControllerConfiguration class to true and the menu will not appear anymore.

In this case, there will be an extra problem – the controller won’t send messages to the app anymore. You will need some extra steps to regain control:

  • Set the ActiveControllerWhenMenuIsSuppressed property of RadialControllerConfiguration to point to the controller
  • Capture the ButtonHolding event of the controller to set the actions when the user is holding the button
  • Give feedback to the user, as he won’t see the menu anymore

With these steps, you’re ready and don’t need to show the menu.

We will add a new TextBlock to the window to show the tool the user is using. In MainPage.xaml, add this code:

 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Rectangle ...
    </Rectangle>
    <TextBlock x:Name="ToolText" HorizontalAlignment="Right" VerticalAlignment="Bottom" 
               Margin="5" Foreground="Red" FontSize="20" FontWeight="Bold"/>
</Grid>

Then, in the constructor of MainPage, add this code:

// Leave only the Volume default item - Zoom and Undo won't be used
RadialControllerConfiguration config = RadialControllerConfiguration.GetForCurrentView();
config.SetDefaultMenuItems(new[] { RadialControllerSystemMenuItemKind.Volume });
config.ActiveControllerWhenMenuIsSuppressed = controller;
config.IsMenuSuppressed = true;
controller.ButtonHolding += (s, e) => _isButtonHolding = true;
controller.ButtonReleased += (s, e) => _isButtonHolding = false;
ToolText.Text = _currentTool.ToString();

It will suppress the menu, set the controller as the active controller when the menu is suppressed and set the _isButtonHolding field to true when the button is pressed. The next step is to change tools when the button is pressed. This is done in the RotationChanged event:

private void ControllerRotationChanged(RadialController sender,
    RadialControllerRotationChangedEventArgs args)
{
    if (_isButtonHolding)
    {
        _currentTool = args.RotationDeltaInDegrees > 0 ? 
            MoveNext(_currentTool) : MovePrevious(_currentTool); 
        ToolText.Text = _currentTool.ToString();
        return;
    }
    switch (_currentTool)
    ...

When the button is pressed, we change the current tool by calling the MoveNext and MovePrevious (depending of the direction of the rotation) methods:

private CurrentTool MoveNext(CurrentTool currentTool)
{
    return Enum.GetValues(typeof(CurrentTool)).Cast()
        .FirstOrDefault(t => (int)t > (int)currentTool);
}

private CurrentTool MovePrevious(CurrentTool currentTool)
{
    return currentTool == CurrentTool.Resize ? CurrentTool.Color :
        Enum.GetValues(typeof(CurrentTool)).Cast()
        .OrderByDescending(t => t)
        .FirstOrDefault(t => (int)t < (int)currentTool);
}

These methods use LINQ to get the next tool and, if there isn’t one, reset to the first (or last). With this code in place, you can run the app and see that the menu isn’t shown, but the tool is changed when the dial is pressed and rotated, and the TextBlock reflects the current tool.

image

Haptic Feedback

Another improvement in the SDK is the ability to control the haptic feedback, the vibration the dial sends for every change in the rotation. You can disable this feedback by setting the UseAutomaticHapticFeedback property of the controller to false. You can then send your feedback using the methods SendHapticFeedback, SendHapticFeedbackForDuration and SendHapticFeedbackForPlayCount of the SimpleHapticsController class. You can get an instance of this class using the SimpleHapticsController property of the RadialControllerRotationChangedEventArgs class in the RotationChanged event.

We will add the feedback when the user tries to move the rectangle beyond the window’s limits. The first step is to remove the feedback, in the constructor of MainPage:

controller.UseAutomaticHapticFeedback = false;

The next step is to check if the movement is beyond the window’s limits and send the feedback if it is:

case CurrentTool.MoveX:
    if (CanMove(Translate, Scale, args.RotationDeltaInDegrees))
    {
        Translate.X += args.RotationDeltaInDegrees;
        if (args.IsButtonPressed)
            Translate.Y += args.RotationDeltaInDegrees;
    }
    else
        SendHapticFeedback(args.SimpleHapticsController,3);
    break;
case CurrentTool.MoveY:
    if (CanMove(Translate, Scale, args.RotationDeltaInDegrees))
    {
        Translate.Y += args.RotationDeltaInDegrees;
        if (args.IsButtonPressed)
            Translate.X += args.RotationDeltaInDegrees;
    }
    else
        SendHapticFeedback(args.SimpleHapticsController,3);
    break;

The code uses the CanMove method to check if the user is trying to move outside the limits and then, if that’s the case, it calls the SendHapticFeedback method to send the feedback. The CanMove method uses the translation, scale and rotation delta to check it the rectangle can be moved:

private bool CanMove(TranslateTransform translate, ScaleTransform scale,
    double delta)
{
    var canMove = delta > 0 ?
        translate.X + 60 * scale.ScaleX + delta < ActualWidth / 2 &&
        translate.Y + 60 * scale.ScaleY + delta < -ActualWidth / 2 &&
        translate.X - 60 * scale.ScaleX + delta > -ActualWidth / 2 &&
        translate.Y - 60 * scale.ScaleY + delta > -ActualHeight / 2;
    return canMove;
}

SendHapticFeedback receives the SimpleHapticsController as a parameter and sends the feedback:

private void SendHapticFeedback(SimpleHapticsController simpleHapticsController, int count)
{
    var feedback = simpleHapticsController.SupportedFeedback.FirstOrDefault(f =>; 
        f.Waveform == KnownSimpleHapticsControllerWaveforms.Click);
    if (feedback != null)
        simpleHapticsController.SendHapticFeedbackForPlayCount(feedback, 1, count, 
            TimeSpan.FromMilliseconds(100));
}

This method uses LINQ to get the feedback of type Click and, if it finds it, it uses the SendHapticFeedbackForPlayCount to send the feedback three times with an interval of 100ms. We just need to make an extra change: as we removed completely the feedback, there will be no feedback when the user changes tools. One way to restore it is to send the feedback every time we change tools:

if (_isButtonHolding)
{
    _currentTool = args.RotationDeltaInDegrees > 0 ?
        MoveNext(_currentTool) : MovePrevious(_currentTool);
    ToolText.Text = _currentTool.ToString();
    SendHapticFeedback(args.SimpleHapticsController, 1);
    return;
}

Now, if you run the app, you will see that there is no more feedback for every rotation, but you still get feedback when you change tools or when you try to move beyond window’s limits.

Conclusions

We could see a lot of improvements in the Surface Dial API, now we have a lot of control on the menu and on the feedback sent to the user. The Surface Dial brings a new way to input data into your apps, and using it can improve the user experience for your users and make your app stand above the competition.

The full source code for this project is at https://github.com/bsonnino/SurfaceDial2

Removal instructions for ScreenUp

What is ScreenUp?

The Malwarebytes research team has determined that ScreenUp is adware. These adware applications display advertisements not originating from the sites you are browsing.

https://forums.malwarebytes.com/topic/201122-removal-instructions-for-screenup/

Yeah… nah.

SQL 2016 – It Just Runs Faster: Automatic Soft NUMA

По материалпм статьи: SQL 2016 – It Just Runs Faster: Automatic Soft NUMA
30 марта 2016

Автор: Nitin Verma – Principal SQL Server Developer, Bob Dorr – Principal SQL Server Escalation Engineer

Мощности серверного оборудования растут из года в год, что обусловлено многолетним развитием технологий изготовления процессоров. Анализируя результаты наших исследований того, как работает SQL Server на современном оборудовании, и как наши клиенты достигают оптимального для себя масштабирования вычислительных ресурсов, мы выдвинули на передний план дальнейшего развития сервера баз данных необходимость улучшения возможностей секционирования обслуживания нагрузки. В настоящее время, именно основанный на секционировании дизайн является самым распространённым способом локализации обслуживания нагрузки и улучшения производительности и масштабируемости. Примером того, как SQL Server использует секционирование нагрузки является объект CMemThread.

Continue reading

Spybot Search & Destroy Weekly Update – May 17, 2017

2017-05-17
Adware
++ Ad.GrabRez + bProtector + Win32.InCore
PUPS
+ Avanquest.PCSpeedMaximizer + DealPly + PU.Jawego.PCCleaner ++ PU.Lishbos.RegistryScanner ++ PU.Mindspark.VideoDownloadConverter ++ PU.Polarity.MyFlightApp + PU.RealTimeGaming ++ PU.Tool.OperaPasswordDecryptor
Security

+ Microsoft.Windows.RedirectedHosts
Trojans

+ Win32.OnLineGames.gen + Win32.Qhost.ahnj + Win32.VB.ik
Total: 2629186 fingerprints in 840219 rules for 7872 products.»www.safer-networking.org ··· updates/

Removal instructions for Smart System Care

What is Smart System Care?

The Malwarebytes research team has determined that Smart System Care is a “system optimizer”. These so-called “system optimizers” use intentional false positives to convince users that their systems have problems. Then they try to sell you their software, claiming it will remove these problems.

https://forums.malwarebytes.com/topic/201055-removal-instructions-for-smart-system-care/

MVPS HOSTS File Update May 16-2017

The MVPS HOSTS file was recently updated [May 16-2017]
http://winhelp2002.mvps.org/hosts.htm

Note: Windows 10 users … the HOSTS file installs with no issues …

Download: hosts.zip (130 kb)
http://winhelp2002.mvps.org/hosts.zip

How To: Download and Extract the HOSTS file
http://winhelp2002.mvps.org/hosts2.htm

HOSTS File – Frequently Asked Questions
http://winhelp2002.mvps.org/hostsfaq.htm

Note: the “text” version (489 kb) makes a great resource for determining possible unwanted connections …
http://winhelp2002.mvps.org/hosts.txt

Get notified when the MVPS HOSTS file is updated
http://winhelp2002.mvps.org/updates.htm

If you find the MVPS HOSTS file useful … please consider a donation …
http://winhelp2002.mvps.org/hosts.htm#donation

Build 2017, le plein de nouveautés :-)

Bonjour tout le monde,

La Build 2017 s’est achevée vendredi dernier à Seattle. Elle a donné lieu à de très nombreuses annonces : quels que soient vos projets et votre environnement de dev, il y a plus que jamais une solution Microsoft pour vous aider à en faire plus !

> retour sur les principales nouveautés

Temps de lecture : 4 minutes et 42 secondes

Vous pouvez aussi écouter les podcasts des Frenchies@Build qui décryptent toutes les annonces ici : http://dev.microsoft.fr/build/?wt.mc_id=AID521865_EML_5064460 

Nouveautés sur le blog Azure https://azure.microsoft.com/en-us/blog/?wt.mc_id=AID521865_EML_5064460

Nouveautés sur le blog Windows https://blogs.windows.com/?wt.mc_id=AID521865_EML_5064460#2uAeiJvZrgTkuTof.97

Bonne journée 😊

Patrice.

Removal instructions for FileTour bundler

What is FileTour bundler?

The Malwarebytes research team has determined that FileTour bundler is a browser hijacker. These so-called “hijackers” manipulate your browser(s), for example to change your startpage or searchscopes, so that the affected browser visits their site or one of their choice.
This one changes your startpage, your seach provider and it also displays advertisements.

https://forums.malwarebytes.com/topic/200945-removal-instructions-for-filetour-bundler/

Recent Comments

Archives