none
Работа с MS SQL и AD в powershell RRS feed

  • Вопрос

  • Здравствуйте! Вопрос по powershell

    В базе SQL Server есть таблица содержащая столбцы US_NAME и ACCESS. В US_NAME записаны имена пользователей (совпадает с AD). Нужно добавлять в группу AD тех пользователей, у которых ACCESS=1, а тех у кого ACCESS=0 соответственно удалять из группы.

    Пробовал построить запрос к БД так, что выходные данные помещаются в csv-файл. Но в итоге в файле получается нечто похожее

    US_NAME
    ------------
    user1
    user2

    Ради эксперимента пробовал считать в переменную только 3 строку этого csv, после чего подсунуть эту переменную в командлет add-adgroupmember, но в итоге последний выдал ошибку о том что пользователь с таким именем не найден. 

    Это навело меня на мысль ещё раз заглянуть в csv... Как оказалось следом за именем пользвателя стоит множество пробелов, после удаления которых все нормально отрабатывает. Удалял пробелы вручную.

    Хотелось бы спросить, как лучше всего реализовать поставленную задачу?

    14 июня 2020 г. 19:49

Ответы

  • Теперь понятен источник ваших трудностей - вы вытаскиваете результат запроса в текстовый файл, предназначенный для печати, через аналог sqlcmd.exe, и теперь вам нужно разобрать (to parse) результат.

    Куда удобнее решать эту задачу с помощью классов ADO.Net  - SqlConnection, SqlCommand и, возможно, Dataset -  которые позволяют извлечь результат в виде объекта класса System.Data.SqlClient.SqlDataReader или System.Data.DataTable и обращаться к его методам для считывания записей и содержимого полей, как в этих примерах:

    https://superuser.com/questions/1178980/create-a-csv-file-with-powershell

    https://gist.github.com/Gimly/987708bdec70820d78f428981266e37e

    PS А если хотите мучаться, то удалить лишние пробелы можно с помощью метода trim класса String, примерно так:

    $a = "   abc   "
    $a = $a.trim()


    Слава России!



    • Изменено M.V.V. _ 15 июня 2020 г. 11:03
    • Помечено в качестве ответа Vector BCOModerator 17 июня 2020 г. 13:37
    15 июня 2020 г. 10:57

Все ответы

  • 1 не видать запрос в базу и кода который это делает

    2 накой вам csv если информация и так уже хранится в базе?

    3 пош вы хотите в самой базе как внешнюю процедуру прикрепить или это скрипт который должен в базу ломиться и чегой-то там в ад делать?


    The opinion expressed by me is not an official position of Microsoft


    14 июня 2020 г. 20:32
    Модератор
  • Хотелось бы спросить, как лучше всего реализовать поставленную задачу?

    Мои слабые телепатические способности подсказывают, что вам лучше использовать для экспорта в csv специально предназаначенный для этого командлет Export-Csv, а не просто перенаправлять выдачу команды Format-Table (ft) в файл.

    PS А чтобы не испытывать на телепатические способности меня или других отвечающих, пожалуйста ваш скрипт, или, хотя бы, его часть, которая вызывает у вас проблему.


    Слава России!

    14 июня 2020 г. 21:54
  • Извиняюсь, что сразу не выложил весь скрипт

    add-pssnapin sqlserverprovidersnapin100
    add-pssnapin sqlservercmdletsnapin100
    $id_users = invoke-sqlcmd -query "SELECT max(ID) FROM INTERNET_SQL.dbo.Users" -ServerInstance "MBS1\MARINA_SQL"
    $id_count = 1
    while ($id_count -eq $id_users) 
    { 
    $us_access = invoke-sqlcmd -query "SELECT ACCESS FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL"
    $user_name = invoke-sqlcmd -query "SELECT US_NAME FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL"
    if ($us_access -eq 1)
    {
    add-adgroupmember -identity internet_full_permit -members $user_name 
    }
    else
    {
    Remove-ADGroupMember -Identity internet_full_permit -Members $user_name -confirm:$false
    }
    $id_count = $id_count+1
    }
    exit
    

    база MS SQL Server 2008 R2 Standart

    15 июня 2020 г. 10:35
  • Теперь понятен источник ваших трудностей - вы вытаскиваете результат запроса в текстовый файл, предназначенный для печати, через аналог sqlcmd.exe, и теперь вам нужно разобрать (to parse) результат.

    Куда удобнее решать эту задачу с помощью классов ADO.Net  - SqlConnection, SqlCommand и, возможно, Dataset -  которые позволяют извлечь результат в виде объекта класса System.Data.SqlClient.SqlDataReader или System.Data.DataTable и обращаться к его методам для считывания записей и содержимого полей, как в этих примерах:

    https://superuser.com/questions/1178980/create-a-csv-file-with-powershell

    https://gist.github.com/Gimly/987708bdec70820d78f428981266e37e

    PS А если хотите мучаться, то удалить лишние пробелы можно с помощью метода trim класса String, примерно так:

    $a = "   abc   "
    $a = $a.trim()


    Слава России!



    • Изменено M.V.V. _ 15 июня 2020 г. 11:03
    • Помечено в качестве ответа Vector BCOModerator 17 июня 2020 г. 13:37
    15 июня 2020 г. 10:57
  • Извиняюсь, что сразу не выложил весь скрипт

    add-pssnapin sqlserverprovidersnapin100
    add-pssnapin sqlservercmdletsnapin100
    $id_users = invoke-sqlcmd -query "SELECT max(ID) FROM INTERNET_SQL.dbo.Users" -ServerInstance "MBS1\MARINA_SQL"
    $id_count = 1
    while ($id_count -eq $id_users) 
    { 
    $us_access = invoke-sqlcmd -query "SELECT ACCESS FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL"
    $user_name = invoke-sqlcmd -query "SELECT US_NAME FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL"
    if ($us_access -eq 1)
    {
    add-adgroupmember -identity internet_full_permit -members $user_name 
    }
    else
    {
    Remove-ADGroupMember -Identity internet_full_permit -Members $user_name -confirm:$false
    }
    $id_count = $id_count+1
    }
    exit

    база MS SQL Server 2008 R2 Standart

    1 если база SQL дудет содержать maxID = 10000000000000 то ваш запрос будет работать пол вечности даже если фактических записей в базе 2 с ID 10000000000000 и 9999999999999

    2 делать запросы по одному ID да еще и 2 раза для получения 2х разный свойств увеличит время выполнения вашего скрипта в 2 раза. Если в п.1 будет пол вечности то делая по 2 запроса на каждой итерации тут вы уже получаете вечность

    Invoke-Sqlcmd -ServerInstance localhost\sqlexpress -Database UsersDB -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            $UserExist = $Username -in (Get-ADGroupMember "GroupName").SamAccountName
            if ($Enabled -and (! $UserExist)){
                #Пользюк должен быть добавлен в группу но в он в группе не находится
                Add-AdGroupMember -Identify "GroupName" -Members $Username
            } elseif ((! $Enabled) -and $UserExist){
                 # Пользюк в группе но не должен быть - удаляем
                 Remove-AdGroupMember -Identify "GroupName" -Members $Username
            }
        }
    }

    К слову о каком поше и на какой ос идет речь?

    какая версия модуля sqlserver у вас используется?

    Последняя актуальная версия модуля 21.1.18221


    The opinion expressed by me is not an official position of Microsoft

    15 июня 2020 г. 12:03
    Модератор
  • ОС 2008 R2 SP1, SQL: 2008 R2 Standart Версия 10.50.1617.0, SQL стоит на отдельном серваке, скрипт запускается на контроллере домена, SQL Server Managment Studio на контроллере домена установлено.

    Powershell - версия 3.0

    16 июня 2020 г. 14:57
  • начните с обновления поша на поддерживаемую версию (сечас это 5.1)

    потом можно обновить студию и модуль (версию которого вы не упомянули) - все это бесплатно, и должно спокойно ставиться на раритетные ос, по типу 2008р2

    к слову и сервер было бы неплохо обновить так как он уже пол года как не поддерживается, но это уже другая история не относящаяся к данному вопросу непосредственно + эта операция не столь проста как первые 3 и стоит чуть больше 0$


    The opinion expressed by me is not an official position of Microsoft

    16 июня 2020 г. 20:24
    Модератор
  • начните с обновления поша на поддерживаемую версию (сечас это 5.1)

    потом можно обновить студию и модуль (версию которого вы не упомянули) - все это бесплатно, и должно спокойно ставиться на раритетные ос, по типу 2008р2

    А можно поинтересоваться, с какой целью вы дали этот совет? По-моему, этот совет неправильный: все те средства, которыми пользуется спрашивающий, с тех пор не менялись, так что новая версия вряд ли что даст, кроме геморроя с её установкой и, возможно, совместимостью с тем, что уже есть на сервере.

    Теперь по самому вопросу. Я проверил, что именно реально возвращает Invoke-Sqlcmd - в документации этот вопрос освещен невнятно, и вообще говоря, ошибочно. Я вынужден признать, что в предыдущем посте я ошибся - этот командлет возвращает не строку (как можно подумать из документации), а массив объектов ADO.Net (или один объект, если возвращается одна запись - обычное поведение Powershell) System.Data.DataRow, с которым вполне удобно работать (а на экране же и в файле, куда перенаправляется вывод, мы видим результат стандартного форматирования этого массива - с помощью Format-Table).

    В частности, чтобы исправить скрипт автора вопроса, в нем следует следует заменить вот эти две строки:

    $us_access = invoke-sqlcmd -query "SELECT ACCESS FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL"
    $user_name
    = invoke-sqlcmd -query "SELECT US_NAME FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL"

    на вот такую последовательность команд (с учетом вашего справедливого замечания, что запрос надо делать один раз):

    $rec=@(invoke-sqlcmd -query "SELECT ACCESS,US_NAME FROM INTERNET_SQL.dbo.Users WHERE ID=$id_count" -ServerInstance "MBS1\MARINA_SQL")[0] $us_access = $rec[0] $user_name = $rec[1]

    На самом деле, конструкция @(...)[0] тут - на всякий случай, чтобы только взять первую запись, если запрос вдруг вернет несколько записей. Если есть уверенность, что запись всегда ровно одна, то можно обойтись без нее: $rec=invoke-sqlcmd...


    Слава России!











    • Изменено M.V.V. _ 17 июня 2020 г. 1:06
    17 июня 2020 г. 0:49
  • M.V.V., PoSh поддерживаемой версии это 5.1, не 3, не 2, а именно 5.1 поэтому если что-то не работает на старых редакциях - устанавливаем новые. Хз влияет ли на что-то студия в данном вопросе, но каждая версия студии содержит фиксы по сравнению со старыми версиями.

    Что значит комментарий про средва которые не менялись, хз, так как пош менялся уже 3 раза (4, 5.0 и 5.1), модуль менялся, да и студия менялась много раз (хоть как говлрил выше не знаю насколько она важна в этом случае)

    Версия модуля не упоминалась, но я проверил 21.0 и 21.1 и Invoke-SQLCmd и все прекрасно работает

    В вашем примере у $Rec будет 2 набора именованых свойств в которым вполне можно обращаться и делить результаты на users и access_rights избыточно, так как в каждом экземпляре обьекта имеются оба свойства


    The opinion expressed by me is not an official position of Microsoft

    17 июня 2020 г. 4:54
    Модератор
  • Invoke-Sqlcmd -ServerInstance localhost\sqlexpress -Database UsersDB -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            $UserExist = $Username -in (Get-ADGroupMember "GroupName").SamAccountName
            if ($Enabled -and (! $UserExist)){
                #Пользюк должен быть добавлен в группу но в он в группе не находится
                Add-AdGroupMember -Identify "GroupName" -Members $Username
            } elseif ((! $Enabled) -and $UserExist){
                 # Пользюк в группе но не должен быть - удаляем
                 Remove-AdGroupMember -Identify "GroupName" -Members $Username
            }
        }
    }


    Предложенный Вами скрипт выдает ошибку:

    Add-AdGroupMember : Не удается найти объект с удостоверением: "r2ddd     " в "DC=marin
    a,DC=local".


    • Изменено R2DDD 17 июня 2020 г. 9:49
    17 июня 2020 г. 9:48
  • Invoke-Sqlcmd -ServerInstance localhost\sqlexpress -Database UsersDB -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            $UserExist = $Username -in (Get-ADGroupMember "GroupName").SamAccountName
            if ($Enabled -and (! $UserExist)){
                #Пользюк должен быть добавлен в группу но в он в группе не находится
                Add-AdGroupMember -Identify "GroupName" -Members $Username
            } elseif ((! $Enabled) -and $UserExist){
                 # Пользюк в группе но не должен быть - удаляем
                 Remove-AdGroupMember -Identify "GroupName" -Members $Username
            }
        }
    }


    Предложенный Вами скрипт выдает ошибку:

    Add-AdGroupMember : Не удается найти объект с удостоверением: "r2ddd     " в "DC=marin
    a,DC=local".

    покажите селект из базы и как у вас выглядит скрипт

    The opinion expressed by me is not an official position of Microsoft

    17 июня 2020 г. 10:19
    Модератор
  • Скрипт

    add-pssnapin sqlserverprovidersnapin100
    add-pssnapin sqlservercmdletsnapin100
    Invoke-Sqlcmd -ServerInstance MBS1\MARINA_SQL -Database INTERNET_SQL -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            $UserExist = $Username -in (Get-ADGroupMember "internet_full_permit").SamAccountName
            if ($Enabled -and (! $UserExist)){
                #Пользюк должен быть добавлен в группу но в он в группе не находится
                Add-AdGroupMember -Identity "internet_full_permit" -Members $Username
            } elseif ((! $Enabled) -and $UserExist){
                 # Пользюк в группе но не должен быть - удаляем
                 Remove-AdGroupMember -Identity "internet_full_permit" -Members $Username
            }
        }
    }

    Select




    • Изменено R2DDD 17 июня 2020 г. 10:32
    17 июня 2020 г. 10:32
  • #$ServerInstance = 'MBS1\MARINA_SQL'
    $ServerInstance = 'localhost\SQLEXPRESS' # У меня сервер называется так
    Invoke-Sqlcmd -ServerInstance $ServerInstance -Database INTERNET_SQL -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            #$UserExist = $Username -in (Get-ADGroupMember "internet_full_permit").SamAccountName
            if ($Enabled){ # -and (! $UserExist)){
                Write-Host "Пользюк '$Username' должен быть добавлен в группу но в он в группе не находится"
                #Add-AdGroupMember -Identity "internet_full_permit" -Members $Username
            } elseif ((! $Enabled)){ # -and $UserExist){
                Write-Host "Пользюк '$Username' в группе но не должен быть - удаляем"
                #Remove-AdGroupMember -Identity "internet_full_permit" -Members $Username
            }
        }
    }
    При выполнении кода у меня результат следующий

    При этом таблица в базе выглядит так

    Стоит заметить что псснапины я не импортирую, так как PoSh 5 подтягивает необходимые модули автоматически + вангую что снапин может возвращать не обьект а строку, хештаблиицу или что-либо другое, так как МС настоятельно рекоммендует снапины не использовать и мигрирует все в модули

    Не хотите экспериментировать с контроллером домена, возьмите любой админский ПК, установките на него RSAT (чтоб коммандлеты АД были доступны), обновите пош и попробуйте выполнить


    The opinion expressed by me is not an official position of Microsoft

    17 июня 2020 г. 11:18
    Модератор
  • M.V.V., PoSh поддерживаемой версии это 5.1, не 3, не 2, а именно 5.1 поэтому если что-то не работает на старых редакциях - устанавливаем новые. Хз влияет ли на что-то студия в данном вопросе, но каждая версия студии содержит фиксы по сравнению со старыми версиями.

    Что значит комментарий про средва которые не менялись, хз, так как пош менялся уже 3 раза (4, 5.0 и 5.1), модуль менялся, да и студия менялась много раз (хоть как говлрил выше не знаю насколько она важна в этом случае)

    Версия модуля не упоминалась, но я проверил 21.0 и 21.1 и Invoke-SQLCmd и все прекрасно работает

    В вашем примере у $Rec будет 2 набора именованых свойств в которым вполне можно обращаться и делить результаты на users и access_rights избыточно, так как в каждом экземпляре обьекта имеются оба свойства


    The opinion expressed by me is not an official position of Microsoft

    "Средства" - это использованные команды Powershell, элементы его языка, и объекты ADO.Net/.Net SQL  Client. И тут всё, что автор вопроса использовал, работает одинаково начиная даже с ещё более старых версий, чем у него. "Не работает" у автора не потому, что не поддерживается или работает с ошибкой что-то нужное ему, а из-за наличия ошибок в его коде. Поэтому обновление версий продуктов не поможет в данном случае решить проблему (а вот создать проблемы с совместимостью где-нибудь в другом месте - запросто).

    Насчет того, что являет собой $Rec, и как с ним работать, можно посмотреть по приведенной ссылке на документацию (или, если есть свободное время, почитать как вообще работать с ADO.Net) : вариант получить значения полей (тех самых "наборов свойств") там не один, и, в частности, синтаксис обращения к хэш-таблице по ключу-имени поля там тоже поддерживается.

    PS Поскольку автору вопроса явно комфортнее общаться с вами, а не со мной, то я больше в обсуждении участвовать, наверное, не буду. Потому как пользы автору вопроса это не принесет, а просто так тут умничать - это никому не нужно.


    Слава России!




    • Изменено M.V.V. _ 17 июня 2020 г. 12:31
    17 июня 2020 г. 12:28
  • Invoke-Sqlcmd -ServerInstance localhost\sqlexpress -Database UsersDB -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            $UserExist = $Username -in (Get-ADGroupMember "GroupName").SamAccountName
            if ($Enabled -and (! $UserExist)){
                #Пользюк должен быть добавлен в группу но в он в группе не находится
                Add-AdGroupMember -Identify "GroupName" -Members $Username
            } elseif ((! $Enabled) -and $UserExist){
                 # Пользюк в группе но не должен быть - удаляем
                 Remove-AdGroupMember -Identify "GroupName" -Members $Username
            }
        }
    }


    Предложенный Вами скрипт выдает ошибку:

    Add-AdGroupMember : Не удается найти объект с удостоверением: "r2ddd     " в "DC=marin
    a,DC=local".

    попробуйте $username = $_.username заменить на $username = $($_.username).trim() как советовал M.V.V. пару ответов тому

    похоже что "r2ddd    " у вас с пробелами в базе записано


    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Vector BCOModerator 17 июня 2020 г. 13:39
    17 июня 2020 г. 13:02
    Модератор
  • M.V.V., PoSh поддерживаемой версии это 5.1, не 3, не 2, а именно 5.1 поэтому если что-то не работает на старых редакциях - устанавливаем новые. Хз влияет ли на что-то студия в данном вопросе, но каждая версия студии содержит фиксы по сравнению со старыми версиями.

    Что значит комментарий про средва которые не менялись, хз, так как пош менялся уже 3 раза (4, 5.0 и 5.1), модуль менялся, да и студия менялась много раз (хоть как говлрил выше не знаю насколько она важна в этом случае)

    Версия модуля не упоминалась, но я проверил 21.0 и 21.1 и Invoke-SQLCmd и все прекрасно работает

    В вашем примере у $Rec будет 2 набора именованых свойств в которым вполне можно обращаться и делить результаты на users и access_rights избыточно, так как в каждом экземпляре обьекта имеются оба свойства


    The opinion expressed by me is not an official position of Microsoft

    "Средства" - это использованные команды Powershell, элементы его языка, и объекты ADO.Net/.Net SQL  Client. И тут всё, что автор вопроса использовал, работает одинаково начиная даже с ещё более старых версий, чем у него. "Не работает" у автора не потому, что не поддерживается или работает с ошибкой что-то нужное ему, а из-за наличия ошибок в его коде. Поэтому обновление версий продуктов не поможет в данном случае решить проблему (а вот создать проблемы с совместимостью где-нибудь в другом месте - запросто).

    Насчет того, что являет собой $Rec, и как с ним работать, можно посмотреть по приведенной ссылке на документацию (или, если есть свободное время, почитать как вообще работать с ADO.Net) : вариант получить значения полей (тех самых "наборов свойств") там не один, и, в частности, синтаксис обращения к хэш-таблице по ключу-имени поля там тоже поддерживается.

    PS Поскольку автору вопроса явно комфортнее общаться с вами, а не со мной, то я больше в обсуждении участвовать, наверное, не буду. Потому как пользы автору вопроса это не принесет, а просто так тут умничать - это никому не нужно.


    Слава России!




    Относительно версий powershell Вы правы. А вот предложенный Вами вариант исправления моего кода не сработал, но и никаких ошибок не выдал.
    17 июня 2020 г. 13:10
  • #$ServerInstance = 'MBS1\MARINA_SQL'
    $ServerInstance = 'localhost\SQLEXPRESS' # У меня сервер называется так
    Invoke-Sqlcmd -ServerInstance $ServerInstance -Database INTERNET_SQL -Query 'Select ID, UserName, Enabled From dbo.UsersWithAccess' | Group-Object Enabled | Foreach {
        $Enabled = ($_.Name -eq 1)
        $_.Group | foreach {
            $Username = $_.Username
            # Тут проверяете добавлен ли пользюк в группу
            #$UserExist = $Username -in (Get-ADGroupMember "internet_full_permit").SamAccountName
            if ($Enabled){ # -and (! $UserExist)){
                Write-Host "Пользюк '$Username' должен быть добавлен в группу но в он в группе не находится"
                #Add-AdGroupMember -Identity "internet_full_permit" -Members $Username
            } elseif ((! $Enabled)){ # -and $UserExist){
                Write-Host "Пользюк '$Username' в группе но не должен быть - удаляем"
                #Remove-AdGroupMember -Identity "internet_full_permit" -Members $Username
            }
        }
    }
    При выполнении кода у меня результат следующий

    При этом таблица в базе выглядит так

    Стоит заметить что псснапины я не импортирую, так как PoSh 5 подтягивает необходимые модули автоматически + вангую что снапин может возвращать не обьект а строку, хештаблиицу или что-либо другое, так как МС настоятельно рекоммендует снапины не использовать и мигрирует все в модули

    Не хотите экспериментировать с контроллером домена, возьмите любой админский ПК, установките на него RSAT (чтоб коммандлеты АД были доступны), обновите пош и попробуйте выполнить


    The opinion expressed by me is not an official position of Microsoft

    Ещё раз перепроверил, предложенный Вами код срабатывает что на версии 3, что на 5.1, но только для юзера с id=2, в тоже время для юзера с id=1 скрипт не срабатывает ни на одной из версий posh - выдаёт уже приведенную мною ошибку.
    17 июня 2020 г. 13:14
  • посмотрите в сторону trim (пару сообщений выше)так как похоже что пробелы у вас в базе записаны

    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа R2DDD 17 июня 2020 г. 13:37
    • Снята пометка об ответе Vector BCOModerator 17 июня 2020 г. 13:39
    17 июня 2020 г. 13:20
    Модератор
  • посмотрите в сторону trim (пару сообщений выше)так как похоже что пробелы у вас в базе записаны

    The opinion expressed by me is not an official position of Microsoft

    Да, действительно так получается. Но почему - не понятно. Я пробовал даже сменить имя юзера, что в ad, что в базе - всё равно с пробелами в базу записывается.
    Заменил, как Вы и советовали - помогло. Спасибо!
    17 июня 2020 г. 13:37
  • посмотрите в сторону trim (пару сообщений выше)так как похоже что пробелы у вас в базе записаны


    The opinion expressed by me is not an official position of Microsoft

    Да, действительно так получается. Но почему - не понятно. Я пробовал даже сменить имя юзера, что в ad, что в базе - всё равно с пробелами в базу записывается.
    Заменил, как Вы и советовали - помогло. Спасибо!
    кто пишет в базу? скорее всего в том механизме какой-то косяк

    The opinion expressed by me is not an official position of Microsoft

    17 июня 2020 г. 13:38
    Модератор
  • посмотрите в сторону trim (пару сообщений выше)так как похоже что пробелы у вас в базе записаны


    The opinion expressed by me is not an official position of Microsoft

    Да, действительно так получается. Но почему - не понятно. Я пробовал даже сменить имя юзера, что в ad, что в базе - всё равно с пробелами в базу записывается.
    Заменил, как Вы и советовали - помогло. Спасибо!

    кто пишет в базу? скорее всего в том механизме какой-то косяк

    The opinion expressed by me is not an official position of Microsoft

    Сам, вручную запросом в SSMS
    17 июня 2020 г. 22:15
  • посмотрите в сторону trim (пару сообщений выше)так как похоже что пробелы у вас в базе записаны


    The opinion expressed by me is not an official position of Microsoft

    Да, действительно так получается. Но почему - не понятно. Я пробовал даже сменить имя юзера, что в ad, что в базе - всё равно с пробелами в базу записывается.
    Заменил, как Вы и советовали - помогло. Спасибо!

    кто пишет в базу? скорее всего в том механизме какой-то косяк

    The opinion expressed by me is not an official position of Microsoft

    Сам, вручную запросом в SSMS
    странно, если не секрет киньте квери, я могу попробовать у себя 

    The opinion expressed by me is not an official position of Microsoft

    17 июня 2020 г. 22:48
    Модератор
  • посмотрите в сторону trim (пару сообщений выше)так как похоже что пробелы у вас в базе записаны


    The opinion expressed by me is not an official position of Microsoft

    Да, действительно так получается. Но почему - не понятно. Я пробовал даже сменить имя юзера, что в ad, что в базе - всё равно с пробелами в базу записывается.
    Заменил, как Вы и советовали - помогло. Спасибо!

    кто пишет в базу? скорее всего в том механизме какой-то косяк

    The opinion expressed by me is not an official position of Microsoft

    Сам, вручную запросом в SSMS

    странно, если не секрет киньте квери, я могу попробовать у себя 

    The opinion expressed by me is not an official position of Microsoft

    UPDATE [INTERNET_SQL].[dbo].[UsersWithAccess]
       SET UserName = 'r2ddd'
     WHERE ID = 1
    GO

    Такое же поведение наблюдается и для INSERT, но почему для другого пользователя записывается без пробелов непонятно. Пробовал даже иначе написать 

    UPDATE [INTERNET_SQL].[dbo].[UsersWithAccess]
       SET UserName = 'RubashkinDB'
     WHERE ID = 1
    GO

    Но тут уже сам SQL стал ругаться при попытке выполнения запроса: "

    Сообщение 8152, уровень 16, состояние 4, строка 1
    Символьные или двоичные данные могут быть усечены"

    Стоит убрать последнюю букву - запрос выполняется, но все равно записывается с пробелом. Даже если в другой  строке записать, не в 1 - все равно с пробелом. Как ни пиши - все равно с пробелом. Хоть Admin, хоть User - все равно с пробелом. 

    Недавно добавил 3 юзверя - и тоже самое повторяется, снова с пробелами записалось.


    • Изменено R2DDD 18 июня 2020 г. 10:20
    18 июня 2020 г. 10:03
  • Пересоздал таблицу изменив тип данных для UserName с nchar(10) на nvarchar(50) после этого проблема с пробелами исчезла.
    18 июня 2020 г. 10:41