SQL Server Auditing

Probably the best mechanism for auditing changes to tables in SQL Server is Change Data Capture, which I already covered here. Unfortunately, it only works with the Enterprise editions of SQL Server, something that not everyone has access to.

I once had to implement a similar solution that should work on any edition of SQL Server, which is what I am going to talk about. Its only requirement was that for any changes made to target tables, their old values would be stored in a shared history table, with the indication of the timestamp and user who made the change.

Let’s imagine we have some table, anything will do:

   1: CREATE TABLE dbo.audit_target

   2: (

   3:     id INT IDENTITY PRIMARY KEY,

   4:     a NVARCHAR(50),

   5:     b INT

   6: )

As you can see, it’s just a regular table with a single-column primary key and a couple of other columns, any number and type will do, doesn’t really matter.

Now let’s create a table for holding the change history:

   1: CREATE TABLE dbo.history

   2: (

   3:     id INT IDENTITY PRIMARY KEY,

   4:     [table_name] NVARCHAR(30) NOT NULL,

   5:     table_id INT NOT NULL,

   6:     [changes] NVARCHAR(MAX),

   7:     [timestamp] SMALLDATETIME NOT NULL DEFAULT GETDATE(),

   8:     [user] NVARCHAR(30) NOT NULL

   9: )

The table_name column shall hold the name of the table whose changes we are tracking, table_id, the id of the updated row, changes will get a XML containing all the old values, timestamp the date and time the change occurred, and user, the person who made the change (more on this later).

OK, next we need a stored procedure to populate the changes table:

   1: CREATE PROCEDURE dbo.generic_audit_procedure

   2: (

   3:     @procid INT,

   4:     @xml XML

   5: )

   6: AS

   7: BEGIN

   8:     SET NOCOUNT ON

   9:     

  10:     -- check if there are changes, in which case, xml will not be empty

  11:     IF ((@xml IS NULL) OR (CAST(@xml AS NVARCHAR(MAX)) = N''))

  12:     BEGIN

  13:         RETURN 0

  14:     END

  15:     

  16:     -- get the current table id for the current process (trigger)

  17:     DECLARE @tablename NVARCHAR(30)

  18:  

  19:     SELECT @tablename = OBJECT_NAME(t.id)

  20:     FROM sys.sysobjects p

  21:     INNER JOIN sys.sysobjects t

  22:     ON p.parent_obj = t.id 

  23:     WHERE p.id = @procid

  24:     

  25:     IF ((@tablename IS NULL) OR (@tablename = N''))

  26:     BEGIN

  27:         RAISERROR(N'Could not get table name', 16, 16)

  28:         ROLLBACK TRAN

  29:         RETURN

  30:     END

  31:     

  32:     -- get the primary key column for the current table

  33:     DECLARE @idname NVARCHAR(30)

  34:  

  35:     SELECT @idname = name 

  36:     FROM sys.syscolumns

  37:     WHERE id = OBJECT_ID(@tablename)

  38:     AND colstat = 1

  39:  

  40:     IF ((@idname IS NULL) OR (@idname = ''))

  41:     BEGIN

  42:         RAISERROR(N'Could not get id column for the current table', 16, 16)

  43:         ROLLBACK TRAN

  44:         RETURN

  45:     END

  46:     

  47:     -- get the current user from the context

  48:     DECLARE @username NVARCHAR(30)

  49:  

  50:     SELECT @username = CONVERT(NVARCHAR(30), CONTEXT_INFO())

  51:  

  52:     IF ((@username IS NULL) OR (@username = ''))

  53:     BEGIN

  54:         RAISERROR(N'Could not get current username', 16, 16)

  55:         ROLLBACK TRAN

  56:         RETURN

  57:     END

  58:  

  59:     DECLARE @tmp TABLE([key] NVARCHAR(MAX), [value] XML)

  60:  

  61:     INSERT INTO @tmp SELECT q.[key], q.[value]

  62:     FROM

  63:     (

  64:         SELECT T.N.value(N'(*[local-name(.)=sql:variable("@idname")])[1]', N'INT') AS [key], T.N.query(N'*') AS [value]

  65:         FROM @xml.nodes('/row') AS T(N)    

  66:     ) q

  67:  

  68:     DECLARE @ROWS INT

  69:     SET @ROWS = 0

  70:  

  71:     -- loop all modified records

  72:     WHILE (1 = 1)

  73:     BEGIN

  74:         DECLARE @id NVARCHAR(MAX)

  75:         DECLARE @value XML

  76:         

  77:         -- pick the first record

  78:         SELECT TOP 1 @id = [key], @value = [value]

  79:         FROM @tmp

  80:         

  81:         IF (@@ROWCOUNT = 0)

  82:         BEGIN

  83:             BREAK

  84:         END

  85:                         

  86:         -- insert into the shared table

  87:         INSERT INTO dbo.history (table_name, table_id, [user], [changes])

  88:         VALUES (@tablename, @id, @username, CAST(@value AS NVARCHAR(MAX)))

  89:         

  90:         -- increment the updated rows

  91:         SET @ROWS = @ROWS + @@ROWCOUNT

  92:         

  93:         -- remove the processed record

  94:         DELETE FROM @tmp

  95:         WHERE [key] = @id

  96:     END

  97:  

  98:     RETURN @ROWS

  99: END

The generic_audit_procedure will get the current table from the current process id, as passed in the @@procid parameter, the current user from CONTEXT_INFO (again, more on this later), the changes from the @xml parameter and will insert everything into the history table.

And the final part, a trigger to “glue” together the changes made to a table to the stored procedure:

   1: CREATE TRIGGER dbo.generic_audit_trigger

   2: ON dbo.test -- replace this with other target tables' names

   3: AFTER UPDATE

   4: AS

   5: BEGIN

   6:     SET NOCOUNT ON

   7:     

   8:     -- get all changes

   9:     -- this needs to be done on the trigger

  10:     DECLARE @xml XML

  11:     SET @xml = (SELECT * FROM inserted FOR XML PATH('row'))

  12:     

  13:     -- call the generic stored procedure

  14:     EXEC dbo.generic_audit_procedure @@PROCID, @xml

  15: END

This trigger will run after changes are accepted (AFTER UPDATE) and will cast all changes (the INSERTED pseudo-table) as XML, and then invoke the generic_audit_procedure stored procedure with it as an argument, together with the current process id (@@PROCID). Of course, you need to call this for every table that you wish to audit.

The only thing left is, we need to provide a way for SQL Server to know the name of the current user. We do that by manually executing the following query (actually, it was an automated process that was executed by the data access library):

   1: DECLARE @username VARBINARY(128) = CAST(N'rjperes' AS VARBINARY(128))

   2: SET CONTEXT_INFO @username

So, whenever a change is made to a table, it will appear as this:

image

You can see that the changes column will contain an XML node with all the old values that were changed by the update made to the target table.

In a nutshell:

  1. We add a trigger that calls a stored procedure upon change to a number of target tables;
  2. Save the application user in CONTEXT_INFO;
  3. Modify the data in a table;
  4. Get the old values in an auditing table;

There are some limitations with this implementation:

  • Only single-column primary key target tables are supported;
  • All of the “old” values are recorded, not just those that changed;
  • It only keeps the “old” values, not the new ones, although this is by design and easy to change;
  • Binary columns could use a better treatment;
  • Doesn’t keep track of deleted or inserted records;
  • Doesn’t track schema changes (add/drop/modify columns, etc);
  • It is necessary to set CONTEXT_INFO explicitly with the application user that we want to record;
  • Although I didn’t implement it, it would be easy to add a version column to the history table, to keep track of how many changes were made to each target table.

However, it suited perfectly what I needed, maybe it will work for you too! Winking smile

Einstellung der Website www.msisafaq.de

Nach der gestern verkündeten Einstellung der Forefront User Group ist heute der Zeitpunkt gekommen, auch die Website www.msisafaq.de einzustellen. Fällt mir nach 13 Jahren nicht leicht. Jedoch ist es ein notwendiger und aus meiner Sicht logischer Schritt:

  • Das Kernprodukt, um das sich die Website dreht, wurde abgekündigt.
  • Ich habe schon lange keinen neuen Artikel mehr veröffentlicht.
  • Die Seite wäre quasi kernsanierungsbedürftig – eigentlich hoffnungslos.

Ich werde die Seite aber nicht vom Netz nehmen, sondern als Referenz verfügbar lassen. Die aktuellen Besucherzahlen zeigen, dass es noch immer ein Interesse dafür gibt. Und letztendlich sind ja noch viele Installationen vorhanden. Solange ich es finanziell realisieren kann wird die Seite also online bleiben. Keine Panik.

Eine andere Website für die Community ist in Planung. Wird dann sicherlich jedoch auf einer anderen Plattform laufen und mehr Möglichkeiten bieten. Dauert aber noch ein bisschen… Thema noch streng geheim :)

Ein ganz großer Dank gilt Christian Gröbner, der die ganzen Jahre immer wieder Beiträge beigesteuert hat sowie immer ein Ohr für mich hatte, wenn ich mal wieder Hilfe oder Ideen brauchte.

Viele Grüße
Dieter


Dieter Rauscher
MVP Enterprise Security

Letztmaliges Treffen der Forefront User Group am 05.03.2015

"Nichts in der Geschichte des Lebens ist beständiger als der Wandel."

Charles Darwin (Englischer Naturforscher)

Am 27. November 2003 fand das erste Treffen der (damals noch) ISA Server User Group in Unterschleißheim bei München statt. Seither fanden knapp 40 weitere Treffen im Raum München statt. Vielen Dank allen Teilnehmern und Referenten!

Microsoft hat ja im September 2012 das Forefront TMG abgekündigt. Bedingt dadurch als auch durch meine berufliche und örtliche Veränderung haben Christian und ich nun vereinbart, dass wir die Forefront User Group in München einstellen. Im vergangenen Jahr ist es uns schon nicht gelungen, ein weiteres Treffen zu organisieren.

Deswegen möchten wir ein letztes Treffen für Donnerstag, 05. März 2015 im Raum München organisieren, quasi um uns von euch zu verabschieden. Wir planen für diesen Abend keine Vorträge ein sondern möchten uns in einem Restaurant treffen und einen gemütlichen Abend verbringen – dabei kann man sich ja auch über das ein oder andere unterhalten :)

Einladungen dazu gehen in den nächsten Stunden wie gewohnt über Xing raus. Alternativ Anmeldung und Details direkt bei mir. Wir würden uns freuen, wenn ihr dabei seid!

Marc und Karsten planen für die Forefront User Group Nord (FUGN) ebenfalls Veränderungen, die werden sie aber selber ankündigen.

Ich arbeite an der Planung neuer Communityprojekte und werde zu gegebener Zeit dazu berichten – meine zeitliche Auslastung erlaubt mir derzeit keine großen Sprünge.

Viele Grüße
Christian und Dieter


Dieter Rauscher
MVP Enterprise Security

How to Turn On or Off Automatically Connect to Wi-Fi Hotspots in Windows 10

If your Windows 10 PC has a Wi-Fi adapter, then Wi-Fi Sense can allow you to automatically connect to Wi-Fi hotspots when in range and not able to connect to one of your usual wireless network profiles.

This tutorial will show you how to turn on or off allowing your Windows 10 PC to automatically connect to Wi-Fi hotspots when in range.

Read more…

Unravelling lists of distinguished names

There are a number of AD properties such as MemberOf and directrports that consist of a collection of distinguisednames.  Sometimes you need the  name  of the object rather than the distinguished name:

function getname {
[CmdletBinding()]
param (
[string]$dn
)

$name = Get-ADObject $dn | select -ExpandProperty Name

return $name
}

Get-ADUser -Filter * -SearchBase "OU=Testing,DC=Manticore,DC=org" -Properties MemberOf |
foreach {
 
$name = $psitem.Name

foreach ($member in $psitem.MemberOf) {
   $props = [ordered]@{
     User = $name
     Group = getname -dn $member
   }

   New-Object -Property $props -TypeName PSObject

}
}

 

In this example I’m looking at the MemberOf property.  Pull back the set of users and foreach look at each member in the MemberOf list. I pass that to a function that returns the name – I can reuse the function in other scripts.

 

Don’t make the mistake of looking at group membership in this way though. You can get the names of group members much more simply

Get-ADGroupMember -Identity tg1 | select name

Filtering on if an AD property exists

There are times when you want to filter the results based on whether a user has an AD property set.  You could do this:

Get-ADUser -Filter * -Properties Title | Where Title  | select Name, Title

 

However, that involves pulling back all of the users and then filtering. Not very efficient especially across the network in a big domain.

A better solution would be to use an LDAP filter

Get-ADUser -LDAPFilter "(Title=*)" -Properties Title  | select Name, Title

 

Get-ADUser does the checking to see if the user has a title set so only those objects with that property are retrieved. If you want to see the value of the property you need to include it by using the –Properties parameter.

Mozilla Firefox Updated to 35.0.1 – January 26, 2015

Firefox Notes
Version 35.0.1, first offered to Release channel users on January 26, 2015

Check out “What’s New” and “Known Issues” for this version of Firefox

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

How to Turn On or Off Tablet Mode in Windows 10

Continuum is Microsoft’s new way of switching between tablet and desktop mode in Windows 10 as needed.

Tablet mode on your desktop PC will basically have everything go fullscreen all the time, removing windowed apps and expanding the Start menu to full screen.

This tutorial will show you how to turn on or off tablet mode to switch between using tablet mode and desktop mode in your user account in Windows 10.

Read more…

Custom Entity Framework Code First Convention for Discriminator Values

Since version 6, Entity Framework Code First allows the injection of custom conventions. These conventions define rules that will be applied by default to all mapped entities and properties, unless explicitly changed.

The conventions API includes a couple of interfaces: IConvention (marker only, should always be included), IConceptualModelConvention<T> (for the conceptual space of the model) and IStoreModelConvention<T> (for the store, or physical, side of the model). Worthy of mention, there is also a convenience class, Convention, that allows access to all mapped types and properties and doesn’t override any of the other conventions, and also TypeAttributeConfigurationConvention<T>, for tying a convention to a custom attribute. Some of the included attributes leverage these interfaces to configure some aspects of the mappings at design time, other configuration needs to be done explicitly in an override of OnModelCreating.

Entity Framework permits using a column for distinguishing between different types, when the Table Per Class Hierarchy / Single Table Inheritance pattern (please see Entity Framework Code First Inheritance for more information) is used for mapping a hierarchy of classes to a single table, as part of “soft delete” solutions, or, less known, for differentiating between multiple tenants. This column is called a discriminator.

In order to configure an entity to use a discriminator column, there is no out of the box attribute, so we must resort to code configuration:

   1: protected override void OnModelCreating(DbModelBuilder modelBuilder)

   2: {

   3:     modelBuilder.Entity<MyMultiTenantEntity>().Map(m => m.Requires("tenant_id").HasValue("first_tenant"));

   4:  

   5:     base.OnModelCreating(modelBuilder);

   6: }

Because there’s really no need to keep repeating this code, let’s implement an attribute for indicating a discriminator column in an entity:

   1: [Serializable]

   2: [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]

   3: public sealed class DiscriminatorAttribute : Attribute

   4: {

   5:     public DiscriminatorAttribute(String columnName, Object discriminatorValue)

   6:     {

   7:         this.ColumnName = columnName;

   8:         this.DiscriminatorValue = discriminatorValue;

   9:     }

  10:  

  11:     public String ColumnName { get; private set; }

  12:  

  13:     public Object DiscriminatorValue { get; private set; }

  14:  

  15:     public override Boolean Equals(Object obj)

  16:     {

  17:         var other = obj as DiscriminatorAttribute;

  18:  

  19:         if (other == null)

  20:         {

  21:             return (false);

  22:         }

  23:  

  24:         return ((this.ColumnName == other.ColumnName) && (Object.Equals(this.DiscriminatorValue, other.DiscriminatorValue) == true));

  25:     }

  26:  

  27:     public override Int32 GetHashCode()

  28:     {

  29:         return (String.Concat(this.ColumnName, ":", this.DiscriminatorValue).GetHashCode());

  30:     }

  31: }

As you can see, the DiscriminatorAttribute attribute can only be applied to a class, at most once. This makes sense, because most likely you will only have a single discriminator column per entity:

   1: [Discriminator("tenant_id", "first_tenant")]

   2: public class MyMultiTenantEntity

   3: {

   4:     //...

   5: }

You need to specify both a column name and a discriminator value, which can be of any type, usually, a string or an integer.

Now, let’s write a custom convention that knows how to handle our custom attribute and perform the mapping:

WARNING! DYNAMICS AND REFLECTION AHEAD!

PROCEED WITH CAUTION!

   1: public sealed class DiscriminatorConvention : TypeAttributeConfigurationConvention<DiscriminatorAttribute>

   2: {

   3:     private static readonly MethodInfo entityMethod = typeof(DbModelBuilder).GetMethod("Entity");

   4:     private static readonly MethodInfo hasValueMethod = typeof(ValueConditionConfiguration).GetMethods().Single(m => (m.Name == "HasValue") && (m.IsGenericMethod == false));

   5:  

   6:     private readonly DbModelBuilder modelBuilder;

   7:     private readonly ISet<Type> types = new HashSet<Type>();

   8:  

   9:     public DiscriminatorConvention(DbModelBuilder modelBuilder)

  10:     {

  11:         this.modelBuilder = modelBuilder;

  12:     }

  13:  

  14:     public override void Apply(ConventionTypeConfiguration configuration, DiscriminatorAttribute attribute)

  15:     {

  16:         if (this.types.Contains(configuration.ClrType) == true)

  17:         {

  18:             //if the type has already been processed, bail out

  19:             return;

  20:         }

  21:  

  22:         //add the type to the list of processed types

  23:         this.types.Add(configuration.ClrType);

  24:  

  25:         dynamic entity = entityMethod.MakeGenericMethod(configuration.ClrType).Invoke(modelBuilder, null);

  26:  

  27:         Action<dynamic> action = arg =>

  28:         {

  29:             var valueConditionConfiguration = arg.Requires(attribute.ColumnName);

  30:             hasValueMethod.Invoke(valueConditionConfiguration, new Object[] { attribute.DiscriminatorValue });

  31:         };

  32:  

  33:         entity.Map(action);

  34:     }

  35: }

This class uses a bit of dynamics and reflection because types are not known at compile time, and hence we cannot use generics directly. Because the Apply method will be called multiple times, we need to keep track of which entities have already been processed by this convention, so as to avoid reprocessing them. We need to pass it the instance of DbModelBuilder, because otherwise our custom convention would have no way to apply the mapping, but I think it is a reasonable trade off.

Et voilà! In order to make use of it, we need to register the convention in OnModelCreating:

   1: protected override void OnModelCreating(DbModelBuilder modelBuilder)

   2: {

   3:     modelBuilder.Conventions.Add(new DiscriminatorConvention(modelBuilder));

   4:  

   5:     base.OnModelCreating(modelBuilder);

   6: }

And that’s it! Happy conventions! Winking smile

January 2015 – TechNet Security newsletter

An excellent article on how to protect passwords and other credentials is highlighted in the January 2015 TechNet Security newsletter

January 2015 – TechNet Security newsletter
https://technet.microsoft.com/en-us/security/cc307424.aspx 

Credential Theft and How to Secure Credentials
https://technet.microsoft.com/en-us/security/dn920237

 

And above all, start  treating your credentials like you do your underwear. Change  them frequently. Never share them. Never leave them lying  around. And they should be sexy. Oh   wait… you are in IT, so maybe not. Let’s go for they should be mysterious and hard to figure out. And the longer the better. Especially on those cold nights when you are called in to deal with unauthorized access because someone else didn’t follow this advice.

Removal instructions for BroAppVersion10

What is BroAppVersion10?

The Malwarebytes research team has determined that BroAppVersion10 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 also displays advertisements.

https://forums.malwarebytes.org/index.php?%2Ftopic%2F163978-removal-instructions-for-broappversion10%2F

How to Open File Explorer to ‘This PC’ or ‘Quick access’ by Default in Windows 10

In Windows 10, File Explorer opens to Quick access by default which shows your Frequent folders and Recent files.

•Frequent folders = Displays up to ten folders that you frequently opened on the system.
•Recent files = Displays up to twenty files that you most recently opened.

This PC displays your Desktop, Documents, Downloads, Pictures, and Videos folders in addition to the usual devices and drives (hard drives, optical drives, and removable devices) and network locations.

This tutorial will show you how to set File Explorer to open to either This PC or Quick access by default for your user account in Windows 10.

Read more…

Entity Framework Pitfalls: Mapping Discriminator Columns

When you use a discriminator column, that is, a column that holds a value that tells Entity Framework what type the row refers to, or what restriction it shall use when querying the entity, you cannot map this column as a property in your entity.

For example, imagine you want to use “soft deletes”, that is, use a database column to represent the “deleted” state of a record instead of actually physically deleting it from the table; you might have an IS_DELETED column of some integer type, that would hold either a 1 or a 0, depending on whether the record is deleted (1) or not (0). In that case, you would build a mapping like this in OnModelCreating:

   1: modelBuilder.Entity<MySoftDeletableEntity>().Map<MySoftDeletableEntity>(m => m.Requires("is_deleted").HasValue(0));

However, you won’t be able to have a corresponding IsDeleted property in the MySoftDeletableEntity, because Entity Framework will throw an exception complaining about it. It is somewhat sad, because it might be useful to refer to it, but that’s the way it is.

Azure IaaS for IT Pros Event Recordings: Free on Microsoft Virtual Academy ‏

cid:image004.jpg@01D00313.74542D40

Azure IaaS for IT Pros Event Recordings on Microsoft Virtual Academy

Did you miss the Azure IaaS for IT Pros Online Event or do you want to watch specific sessions for a second time to deep dive with Azure experts into topics like Core IaaS, Cloud Infrastructure Fabric, or Open Source Software on Azure? All of the technical sessions from the event are now available as on-demand courses at Microsoft Virtual Academy (MVA).
Watch the Azure IaaS for IT Pros courses and earn MVA points!

Become an IaaS go-to guru

Mark Russinovich, Microsoft Azure Chief Technology Officer, kicks off the courses with his keynote on Core IaaS Infrastructure Technical Fundamentals, followed by deep technical training in the technologies critical for IT Pro Implementers, like you. Experts share their technical insights on topics including Core IaaS, Cloud Infrastructure Fabric, Open Source Software on Azure, and Workloads on Azure IaaS.


Be recognized for your skills

Test your knowledge and earn MVA points when you complete the courses. You’ll gain the technical insights you need to prepare for Exam 70-533: Implementing Microsoft Azure Infrastructure Solutions on your way toward Microsoft Azure Specialist Certification.

Azure IaaS for IT Pros on-demand course topics

Course 1

Establish the Foundation: Core IaaS Infrastructure Technical Fundamentals

Course 2

Dive Deep into Networking, Storage,
and Disaster Recovery Scenarios

Course 3

Embrace Open Source Technologies
(Chef and Puppet Configurations, Containerization with Docker and Linux) to Accelerate and Scale Solutions

Course 4

Optimize Windows Workload Architecture and Administration Capabilities Within Azure

Watch Now

cid:image002.jpg@01D0030C.7938A270

Use the Social Media Ready Content to spread the news about this content:

Tweets:

· Great news! All #LevelUpAzure sessions are now available to watch on-demand at @MSVirtAcademy: http://aka.ms/levelupazure

· Miss anything during #LevelUpAzure week? Catch the sessions on-demand & let us know which you found most helpful:  http://aka.ms/levelupazure

· Establish your #Microsoft #Azure IaaS fundamentals in this #LevelUpAzure on-demand course:  http://aka.ms/kq9h0o

· Want to build on your core #Azure #IaaS fundamentals? Tune in for this #LevelUpAzure on-demand course from #MSMVA:  http://aka.ms/kq9h0o

· #LevelUpAzure On-Demand: Take a deep dive into #Azure IaaS Networking & Storage: http://aka.ms/h5bvmd

· Ramp up on Networking & Storage in #Azure #IaaS with this #LevelUpAzure on-demand course from #MSMVA: http://aka.ms/h5bvmd

· Accelerate & scale your #Azure solutions w/ #OpenSource! Learn how in this #LevelUpAzure on-demand course: http://aka.ms/gh8eni

· #Azure solutions meet #OpenSource in this #LevelUpAzure on-demand course. Check it out:  http://aka.ms/gh8eni

· Optimize your workload architecture in #Azure w/ @MSVirtAcademy & #LevelUpAzure on-demand: http://aka.ms/x8ltg3

· Learn about optimized workloads in #Azure #IaaS from the experts in this #LevelUpAzure on-demand course: http://aka.ms/x8ltg3

Facebook:

· Good news! All #LevelUpAzure sessions are now available to stream on-demand at Microsoft Virtual Academy. You can view them here: http://aka.ms/levelupazure

· Miss anything during #LevelUpAzure week? Here’s your chance to catch the sessions on-demand: http://aka.ms/levelupazure

· Want to identify your Microsoft Azure IaaS capabilities and build on the fundamentals? Ramp up in this Azure for IT Pros on-demand course:  http://aka.ms/kq9h0o

· Deep dive into Networking & Storage capabilities with Azure IaaS. Register for this Microsoft Virtual Academy on-demand course to get started:  http://aka.ms/h5bvmd

Image to use in posts:

Running Windows 10 – a solution..

Having given up the computer on which I was running the Preview to a good cause, and after having major issues parallel booting Windows 8 and 10 together, I now have a solution.

I am using the Windows 8.1 Hyper-V facility to ‘house’ Windows 10 Preview. Hyper-V was easy enough to set up, I guess, taking a good few minutes to completely install, and Windows 10 installed just like it would on a regular drive.

It set up on a local account initially but then gave the option for me to use my Microsoft Insider account. That was easy too, but getting an Internet connection took a few look ups and some messing around, but I got it in the end. Even audio set up after a couple of reboots.

So now I have a working Windows 10 Preview which should not be able to cause grief anywhere. This I like.

I allocated 3gb RAM and 127gb drive space to Windows 10, and it all runs very nicely..

 

Sources to help with Hyper-V:

How to get Hyper-V running..

http://windows.microsoft.com/en-ca/windows-8/hyper-v-run-virtual-machines 

How to install Windows 10 into Hyper-V.. a nice little video for you..

https://www.youtube.com/watch?v=D7CUqqBcmAg

How to get an Internet connection..

http://www.techrepublic.com/blog/windows-and-office/create-a-virtual-switch-in-windows-8-client-hyper-v/

Removal instructions for MedPvid

What is MedPvid?

The Malwarebytes research team has determined that MedPvid 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 also displays advertisements.

https://forums.malwarebytes.org/index.php?%2Ftopic%2F163951-removal-instructions-for-medpvid%2F

MVPS HOSTS File Update January 24-2015

The MVPS HOSTS file was recently updated [January 24-2015]

http://winhelp2002.mvps.org/hosts.htm

Download: hosts.zip (134 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 (506 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

UPDATED: Security Advisory for Adobe Flash Player (APSA15-01)

A Security Advisory (APSA15-01) has been published regarding a critical vulnerability (CVE-2015-0311) in Adobe Flash Player 16.0.0.287 and earlier versions for Windows, Macintosh and Linux.  We are aware of reports that this vulnerability is being actively exploited in the wild via drive-by-download attacks against systems running Internet Explorer and Firefox on Windows 8 Windows 8.1 and below.

UPDATE (January 24): users who have enabled auto-update for the Flash Player desktop runtime will be receiving version 16.0.0.296 beginning on January 24. This version includes a fix for CVE-2015-0311. Adobe expects to have an update available for manual download during the week of January 26, and we are working with our distribution partners to make the update available in Google Chrome and Internet Explorer 10 and 11.  For more information on updating Flash Player, please refer to this post.  We will continue to provide updates on this issue via the Adobe PSIRT blog.

http://blogs.adobe.com/psirt/?p=1160

Removal instructions for HQ Cinemax

What is HQ Cinemax?

The Malwarebytes research team has determined that HQ Cinemax 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 also displays advertisements.

https://forums.malwarebytes.org/index.php?%2Ftopic%2F163945-removal-instructions-for-hq-cinemax%2F

How to Expand or Restore Start Menu in Windows 10

Windows 10 build 9926 uses a new expandable Start menu without a Start screen and Apps screen by default now.

When you expand or restore the Start menu, the Start menu will always open the same as it was when last closed by default. For example, if you expand the Start menu to full screen, then it will always open expanded until you restore it.

This tutorial will show you how to expand Start menu to full screen or restore Start menu to normal size in your user account in Windows 10.

Read more…

Recent Comments

Archives