Хранимая процедура, чтобы проверить, существует ли пользователь в базе данных - PullRequest
0 голосов
/ 28 апреля 2020

Я где-то допустил ошибку, и моя хранимая процедура или исходный код не работает должным образом. Я создал приложение, которое собирает всех пользователей из Active Directory и сохраняет до .txt file. Прямо сейчас метод INSERT работает, но он вставляет каждого пользователя. Я хочу вставить только тех пользователей, которые не существуют в базе данных. В противном случае, если пользователь существует в базе данных, проверьте его / ее статус (учетная запись включена / отключена), сравните с данными Active Directory и измените их. Вот что я сделал до сих пор:

USE [DesignSaoOsig1]
GO
/****** Object:  StoredProcedure [dbo].[ADProcTemp]    Script Date: 28. 4. 2020. 15:07:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[ADProcTemp]
@Username varchar(250),
@DisplayName varchar(70),
@isEnabled tinyint,
@PassNevExp tinyint
AS
set nocount on
BEGIN
    IF NOT EXISTS (SELECT TOP 1 PrezimeIme FROM [dbo].[tblZaposleni_AD]
                       WHERE PrezimeIme = @Username
                       AND NetworkLogin = @DisplayName
                       AND Status = @isEnabled
                       AND PassNevExp = @PassNevExp)                   
       BEGIN
           INSERT INTO [dbo].[tblZaposleni_AD](NetworkLogin,PrezimeIme,Status,PassNevExp)
           VALUES (@Username, @DisplayName, @isEnabled,@PassNevExp)
       END
    END

    IF EXISTS (SELECT TOP 1 PrezimeIme FROM [dbo].[tblZaposleni_AD]
                       WHERE PrezimeIme = @Username)     
    BEGIN
    UPDATE  [dbo].[tblZaposleni_AD] 
           SET Status = @isEnabled         
    END

Исходный код

using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.DirectoryServices;
using System.IO;

namespace ActiverDirectory
{
    public class Korisnik
    {
        public int Id { get; set; }
        public string Username { get; set; } //samaccountname
        public string DisplayName { get; set; } //displayname      
        public bool isEnabled { get; set; } //useraccountcontrol
        public bool PassNevExp { get; set; }   //pwdlastset 

    }

    class Program
    {
        static void Main(string[] args)
        {
            foreach (Korisnik korisnik in VratiKorisnike())
            {
                Console.WriteLine(korisnik);
            }
        }

        public void ExcStrPrc(string Username, string DisplayName, bool isEnable, bool PassNevExp)
        {
            SqlConnection conn = new SqlConnection(@"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("ADProcTemp", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Username", Username.ToString().Trim());
            cmd.Parameters.AddWithValue("@DisplayName", DisplayName.ToString().Trim());
            cmd.Parameters.AddWithValue("@isEnabled", Convert.ToInt32(isEnable));
            cmd.Parameters.AddWithValue("@PassNevExp", Convert.ToInt32(PassNevExp));
            conn.Open();
            int k = cmd.ExecuteNonQuery();
            if (k != 0)
            {
                Console.WriteLine("Record Inserted Succesfully into the Database");
            }
            conn.Close();
        }

        public static List<Korisnik> VratiKorisnike()
        {
            List<Korisnik> lstADUsers = new List<Korisnik>();
            string sDomainName = "saos";
            string DomainPath = "LDAP://" + sDomainName;
            string fileLoc = @"C:\output.txt";

            DirectoryEntry searchRoot = new DirectoryEntry(DomainPath);
            DirectorySearcher search = new DirectorySearcher(searchRoot);

            search.Filter = "(&(objectClass=user)(objectCategory=person))";
            search.PropertiesToLoad.Add("samaccountname"); // Username
            search.PropertiesToLoad.Add("displayname"); // display name
            search.PropertiesToLoad.Add("userAccountControl");  // isEnabled
            search.PropertiesToLoad.Add("pwdLastSet"); //passwordExpires

            DataTable resultsTable = new DataTable();
            resultsTable.Columns.Add("samaccountname");
            resultsTable.Columns.Add("displayname");
            resultsTable.Columns.Add("Neaktivan");
            resultsTable.Columns.Add("dontexpirepassword");

            SearchResult result;
            SearchResultCollection resultCol = search.FindAll();

            if (resultCol != null)
            {
                for (int counter = 0; counter < resultCol.Count; counter++)
                {
                    string UserNameEmailString = string.Empty;

                    result = resultCol[counter];

                    if (result.Properties.Contains("samaccountname")
                        && result.Properties.Contains("displayname"))
                    {
                        int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
                        string samAccountName = Convert.ToString(result.Properties["samAccountName"][0]);

                        int isEnable;
                        int Dont_Expire_Password;


                        if ((userAccountControl & 2) > 0)
                        {
                            isEnable = 0;
                        }
                        else
                        {
                            isEnable = 1;
                        }

                        if ((userAccountControl & 65536) > 0)
                        {
                            Dont_Expire_Password = 1;
                        }
                        else
                        {
                            Dont_Expire_Password = 0;
                        }

                        //if ((userAccountControl & 2) != 0)
                        //{
                        //    isEnable = 1;
                        //}
                        //else
                        //{
                        //    isEnable = 0;
                        //}

                        Korisnik korisnik = new Korisnik();
                        korisnik.Username = (result.Properties["samaccountname"][0]).ToString();
                        korisnik.DisplayName = result.Properties["displayname"][0].ToString();
                        korisnik.isEnabled = Convert.ToBoolean(result.Properties["userAccountControl"][0]);

                        DataRow dr = resultsTable.NewRow();
                        dr["samaccountname"] = korisnik.Username.ToString();
                        dr["displayname"] = korisnik.DisplayName.ToString();
                        dr["neaktivan"] = Math.Abs(isEnable);
                        dr["dontexpirepassword"] = Dont_Expire_Password;

                        resultsTable.Rows.Add(dr);

                        // Poziva se store procedura
                        Program p = new Program();
                        p.ExcStrPrc(korisnik.Username.ToString().Trim(), korisnik.DisplayName.ToString().Trim(), Convert.ToBoolean(isEnable), Convert.ToBoolean(Dont_Expire_Password));

                        lstADUsers.Add(korisnik);
                    }
                }
                var json = JsonConvert.SerializeObject(resultCol, Formatting.Indented);
                var res = json;

                Console.WriteLine("Ispis uspjesno obavljen");
                Console.ReadLine();
                File.WriteAllText(fileLoc, json);
            }
            return lstADUsers;
        }
    }
}

Где я допустил ошибку?

1 Ответ

1 голос
/ 28 апреля 2020

Ваша ошибка находится на этой строке в SQL Процедуре хранения.

IF NOT EXISTS (SELECT TOP 1 PrezimeIme FROM [dbo].[tblZaposleni_AD]
                   WHERE PrezimeIme = @Username
                   AND NetworkLogin = @DisplayName
                   AND Status = @isEnabled
                   AND PassNevExp = @PassNevExp)                   

Это должно быть

IF NOT EXISTS (SELECT * FROM [dbo].[tblZaposleni_AD] WHERE PrezimeIme = @Username)                   
BEGIN
   INSERT INTO [dbo].[tblZaposleni_AD](NetworkLogin,PrezimeIme,Status,PassNevExp)
   VALUES (@Username, @DisplayName, @isEnabled,@PassNevExp)
END
ELSE   
BEGIN   

    UPDATE [dbo].[tblZaposleni_AD]
    SET 
        Status  = CASE WHEN Status <> @isEnabled THEN @isEnabled ELSE Status END  
    WHERE 
        PrezimeIme = @Username 

END
...